2013-02-12 55 views
4

任何人都知道如何隐藏FirstNameFirst Name根据java中的大写拆分

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

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

+1

什么是你的'split'代码? – 2013-02-12 07:03:23

+0

你可以在这里找到你的问题的答案: http://stackoverflow.com/questions/3752636/java-split-string-when-an-uppercase-letter-is-found – 2013-12-04 09:49:40

回答

5

不是真的split,只是replaceAll

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

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

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

另一种解决方案是一个大写的英文字母前添加空间,只有当它是由小写英文字母开头:

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

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

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

+0

m真正糟糕的正则表达式用解释编辑答案会更加富有表现力(包括那个'“$ 1”'部分 – exexzian 2013-02-12 07:10:10

+0

+1解释 – exexzian 2013-02-12 11:18:40

4

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++, ' '); 
    } 
    } 

替补:

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); 
+0

http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html:从发布JDK 5开始,这个类已经补充了一个为单个线程StringBuilder设计的等价类。由于StringBuilder类支持所有相同的操作,所以通常应优先使用StringBuilder类,但速度更快,因为它不执行同步。 – Aubin 2013-02-12 07:44:03

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

为什么这个答案downvoted无论如何? – nhahtdh 2013-02-12 07:16:19

+0

也许使用古老的StringBuffer,就像StringBuilder一样快。也许这对于(i = 0; i 2013-02-12 07:19:48

+0

@JoopEggen:StringBuffer是线程安全的(这里不是真的需要,但是,这并不是因为它是陈旧的,我们不应该使用),而StringBuilder不是。 – nhahtdh 2013-02-12 07:28:34

0

您可以使用下面的代码snap

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