5

任何人都知道如何隐藏FirstNameFirst Name

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

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

4

4 回答 4

5

不是真的split,只是replaceAll

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

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

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

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

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

(?<=[a-z])是一个积极的后(?<=pattern)向检查,检查大写字符[A-Z]前面是否有小写英文字母[a-z]。其余的已经在上面解释过了。

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

于 2013-02-12T07:04:32.493 回答
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 );
于 2013-02-12T07:06:32.437 回答
0

您可以使用以下代码快照

   String array[]= "FirstMiddleLast".replaceAll("(?!^)([A-Z])", " $1").split(" ");
   for(String name:array){
      System.out.println(name);
   }
于 2014-06-30T06:26:47.393 回答
-1

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

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();
}
于 2013-02-12T07:07:46.800 回答