在java中基于大写分割

时间:2013-02-12 07:02:19

标签: java uppercase

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

分割必须基于大写字母进行,但它应排除第一个字母。

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

4 个答案:

答案 0 :(得分:5)

不是split,只是replaceAll

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

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

(?!^)为负面预测(?!pattern),只是检查这不是字符串^的开头。我捕获大写英文字母(pattern),并在替换$1中使用捕获的文本($1表示捕获组中捕获的内容 1 被置于替换中string - 在这种情况下,只有一个捕获组。)

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

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

(?<=[a-z])是一个积极的后瞻(?<=pattern),用于检查大写字母[A-Z]是否以小写英文字母[a-z]开头。其余部分已在上面解释过。

根据要求,模式可能会有很大差异。你只举一个例子而不是具体的要求,所以我会猜测并为你挑选一个模式。

答案 1 :(得分:4)

比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 );

答案 2 :(得分:0)

你可以创建自己的东西,如下:

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();
}

答案 3 :(得分:0)

您可以使用以下代码快照

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