2011-02-03 82 views
18

如何隐蔽"HelloWorld""Hello World" .The分裂具有基于大写字母发生,但应排除的第一个字母。插入空格后大写字母

P.S:我知道使用String.split然后合并。只是想知道是否有更好的方法。

+0

作为评论发布而不是回答,因为我不知道 句法。但我敢肯定,这将是很容易写的正则表达式会寻找一个大写字母(是不是在句子的开头)和前添加一个空格。 – DaveJohnston 2011-02-03 12:27:09

+1

您是否期望`convert(“HELLO”)==“H E L L O”`? – vz0 2011-02-03 12:27:18

+0

@ vz0:其实我的字符串在大写字母之间会有一些小写字母。 – Emil 2011-02-03 12:29:39

回答

57
String output = input.replaceAll("(\\p{Ll})(\\p{Lu})","$1 $2"); 

由大写字母follwed小写字母此正则表达式搜索和同前,一个空间,而后者(有效用空格分隔它们)替换它们。它在为了能够在经由反向引用($1$2)替换字符串来重新使用的值使它们中的每一个捕获组()

要找到大写和小写字母,它使用\p{Ll}\p{Lu}(而不是[a-z][A-Z]),因为它处理Unicode标准中的所有大写和小写字母,而不仅仅是在ASCII范围内的那些(this nice explanation of Unicode in regexes大多数也适用于Java)。

+0

+1确实聪明的解决方案! – Nishant 2011-02-03 13:08:50

1

如果你不想使用正则表达式,你可以通过字符串中的字符循环,把它们添加到一个StringBuilder(并添加一个空格字符串生成器,如果你遇到一个大写字母,这不是第一个) :

String s = "HelloWorld"; 
StringBuilder result = new StringBuilder(); 
for(int i=0 ; i<s.length() ; i++) { 
    char c = s.charAt(i); 
    if(i!=0&&Character.isUpperCase(c)) { 
     result.append(' '); 
    } 
    result.append(c); 
} 
0

伪代码:

String source = ...; 
String result = ""; 

// FIXME: check for enf-of-source 

for each letter in source { 
    while current letter not uppercase { 
     push the letter to result; 
     advance one letter; 
    } 
    if not the first letter { 
     push space to result; 
    } 
    push the letter to result; 
} 
4

更好是主观的。这需要一些代码多行:

public static String deCamelCasealize(String camelCasedString) { 
    if (camelCasedString == null || camelCasedString.isEmpty()) 
     return camelCasedString; 

    StringBuilder result = new StringBuilder(); 
    result.append(camelCasedString.charAt(0)); 
    for (int i = 1; i < camelCasedString.length(); i++) { 
     if (Character.isUpperCase(camelCasedString.charAt(i))) 
     result.append(" "); 
     result.append(camelCasedString.charAt(i)); 
    } 
    return result.toString(); 
} 

隐藏这个丑陋的实施工具类,并用它作为一个API(看起来从用户角度确定;))

2
String s = "HelloWorldNishant"; 
    StringBuilder out = new StringBuilder(s); 
    Pattern p = Pattern.compile("[A-Z]"); 
    Matcher m = p.matcher(s); 
    int extraFeed = 0; 
    while(m.find()){ 
     if(m.start()!=0){ 
      out = out.insert(m.start()+extraFeed, " "); 
      extraFeed++; 
     } 
    } 
    System.out.println(out); 

打印

Hello World Nishant

相关问题