【问题标题】:split based on uppercase in java [duplicate]基于java中的大写拆分[重复]
【发布时间】:2013-01-27 10:37:52
【问题描述】:

任何人都知道如何将FirstName 转换为First Name

必须根据 大写 字母进行拆分,但应排除第一个字母。

我知道如何使用拆分来做到这一点。 除了拆分功能之外,还有其他方法可以做到这一点。

【问题讨论】:

标签: java uppercase


【解决方案1】:

不是真的split,只是replaceAll

str.replaceAll("(?!^)([A-Z])", " $1")

此解决方案假定您不想在大写英文字母之前添加空格,如果它是字符串中的第一个字符。因此," FirstName" 将变为 "  First Name"(注意 2 个空格)。

(?!^) 是负前瞻(?!pattern),只是检查这不是字符串^ 的开头。我捕获(pattern) 大写英文字母,并在替换$1 中使用捕获的文本($1 表示捕获组 1 中捕获的任何内容都放在替换字符串中 - 在这种情况下有只有 1 个捕获组)。

另一种在大写英文字母之前添加空格的解决方案,前提是它前面是小写英文字母:

str.replaceAll("(?<=[a-z])([A-Z])", " $1")

(?&lt;=[a-z]) 是一个正向回溯(?&lt;=pattern),它检查大写字符[A-Z] 前面是否有小写英文字母[a-z]。其余的已经在上面解释过了。

模式可以根据要求变化很大。你只给出一个例子而不是具体要求,所以我会胡乱猜测并为你挑选一个模式。

【讨论】:

  • m 正则表达式真的很糟糕,所以用解释编辑答案会更具表现力(包括" $1" 部分
【解决方案2】:

比 replaceAll 快 6 到 11 倍:

  StringBuilder s = new StringBuilder( "FirstName" );
  for( int i = 1; i < s.length(); ++i ) {
     if( Character.isUpperCase( s.charAt( i ))) {
        s.insert( i++, ' ' );
     }
  }

长凳:

  long atStart = System.currentTimeMillis();
  for( int j = 0; j < 1000000; ++j ) {
     StringBuilder s = new StringBuilder( "FirstName" );
     for( int i = 1; i < s.length(); ++i ) {
        if( Character.isUpperCase( s.charAt( i ))) {
           s.insert( i++, ' ' );
        }
     }
  }
  long elapsed1 = System.currentTimeMillis() - atStart;

  atStart = System.currentTimeMillis();
  for( int j = 0; j < 1000000; ++j ) {
     String s = "FirstName";
     s = s.replaceAll("(?!^)([A-Z])", " $1");
  }
  long elapsed2 = System.currentTimeMillis() - atStart;

  System.err.println( "Ratio: " + elapsed2 / (double)elapsed1 );

【讨论】:

【解决方案3】:

您可以创建自己的,如下所示:

private String split(String string) {
    StringBuffer sb = new StringBuffer();
    for (Character character: string.toCharArray()) {
        if (Character.isUpperCase(character)) {
            sb.append(" ");
        }
        sb.append(character);
    }
    return sb.toString().trim();
}

【讨论】:

  • 也许是使用过时的 StringBuffer,因为 StringBuilder 更快。也许for (i = 0; i &lt; string.length(); ++i) { char ch = string.charAt(i); 似乎更有效率。不过我喜欢这个答案。
  • @JoopEggen:StringBuffer 是线程安全的(这里并不真正需要,但不是因为我们不应该使用它是过时的),而 StringBuilder 不是。
  • @nhahtdh 和 Matcher 使用 StringBuffer 进行搜索替换代码。但由于效率较低,因此引入 StringBuilder 时,应尽可能尝试使用 StringBuilder。
  • 您能否至少解释一下您的答案为何/如何解决问题?
【解决方案4】:

您可以使用下面的代码快照

   String array[]= "FirstMiddleLast".replaceAll("(?!^)([A-Z])", " $1").split(" ");
   for(String name:array){
      System.out.println(name);
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2021-11-27
    相关资源
    最近更新 更多