java中基于大写字母的拆分

java中基于大写字母的拆分,java,uppercase,Java,Uppercase,任何人都知道如何将FirstName转换为FirstName 拆分必须基于大写字母进行,但不包括第一个字母 我知道如何使用split。 除了拆分功能之外,还有其他方法可以实现此功能。不是真正的split,只是replaceAll: str.replaceAll("(?!^)([A-Z])", " $1") 此解决方案假定,如果大写英文字母是字符串中的第一个字符,则不希望在其前面添加空格。因此,“FirstName”将变成“FirstName”(注意两个空格) (?!^)为负前瞻(?!模式),只

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

拆分必须基于大写字母进行,但不包括第一个字母

我知道如何使用split。
除了拆分功能之外,还有其他方法可以实现此功能。

不是真正的
split
,只是
replaceAll

str.replaceAll("(?!^)([A-Z])", " $1")
此解决方案假定,如果大写英文字母是字符串中的第一个字符,则不希望在其前面添加空格。因此,
“FirstName”
将变成
“FirstName”
(注意两个空格)

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

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

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

str.replaceAll(“(?6到11倍于replaceAll:

  StringBuilder s = new StringBuilder( "FirstName" );
  for( int i = 1; i < s.length(); ++i ) {
     if( Character.isUpperCase( s.charAt( i ))) {
        s.insert( i++, ' ' );
     }
  }
StringBuilder s=新的StringBuilder(“名字”);
对于(int i=1;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 );
long atStart=System.currentTimeMillis();
对于(int j=0;j<1000000;++j){
StringBuilder s=新StringBuilder(“名字”);
对于(int i=1;i
您可以创建自己的,如下所示:

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

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

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

你的拆分代码是什么?你可以在这里找到你问题的答案:我对正则表达式非常不好,所以编辑带有解释的答案会更有表现力(包括
“$1”
部分可能是使用了古老的StringBuffer,因为StringBuilder更快。可能是
for(i=0;i
似乎效率更高。不过我喜欢这个答案。@JoopEggen:StringBuffer是线程安全的(这里并不真正需要,但这并不是因为它是过时的,我们不应该使用它),而StringBuilder不是。@nhahtdh和Matcher使用StringBuffer搜索替换代码。但由于效率更低,因此引入了StringBuilder,因此应尽可能尝试使用StringBuilder。您能否至少解释一下您的答案解决问题的原因/方式?:自JDK 5发行版起,该类已被补充StringBuilder类与一个设计用于单个线程的等效类StringBuilder一起使用。StringBuilder类通常应优先于此类使用,因为它支持所有相同的操作,但速度更快,因为它不执行同步。