2012-10-22 34 views
0

我想使用正则表达式以下问题:正则表达式替换2个字符与一个

SOME_RANDOM_TEXT 

应转换为:

someRandomText 

如此,_(任何字符)应该用大写字母替换。我发现类似的东西,使用tool

_\w and $& 

如何让仅从更换的第二个字母?有什么建议?谢谢。

+0

某些语言具有标志(例如\ u将相邻的反向引用转换为小写),可以修改反向引用,我不知道在java中是否有这种情况 –

+0

遗憾的是不是 –

+1

如果正则表达式是一个选项,会在正则表达式和替换字符串中的$ 1中使用_([A-Za-z])或'_(\ p {L})'。圆括号捕获组#1中的字母(假设它是第一组parens),'$ 1'作为替换字符串中该组的占位符。 ('\ w'是不正确的,因为它除了字母外还匹配数字和下划线,'\ p {L}'比'[A-Za-z]更正确,因为它匹配Unicode字母,而不仅仅是ASCII。 ) –

回答

4

String.split("_")来说可能比较简单,然后重新加入,将大小写为集合中每个字符串的首字母。

请注意,Apache Commons有很多有用的字符串相关的东西,包括join()方法。

+0

谢谢,我真的不明白lookbehind如何与替换部分($&)一起工作... – immerhart

+0

由于上述方法更简单/不太容易出错等,我已经删除了向后向外部引用。 –

-1

你也可以写一个简单的方法来做到这一点。它更复杂,但更优化:

public static String toCamelCase(String value) { 
    value = value.toLowerCase(); 
    byte[] source = value.getBytes(); 
    int maxLen = source.length; 
    byte[] target = new byte[maxLen]; 
    int targetIndex = 0; 

    for (int sourceIndex = 0; sourceIndex < maxLen; sourceIndex++) { 
     byte c = source[sourceIndex]; 
     if (c == '_') { 
      if (sourceIndex < maxLen - 1) 
       source[sourceIndex + 1] = (byte) Character.toUpperCase(source[sourceIndex + 1]); 
      continue; 
     } 

     target[targetIndex++] = source[sourceIndex]; 
    } 

    return new String(target, 0, targetIndex); 
} 

我喜欢阿帕奇公共图书馆,但有时它的好,知道它是如何工作的,并能编写一些特定的代码,像这样的工作。

+0

它是使用字节错误。你应该使用'toCharArray'。 –

+0

-1 - 不幸的是不是Unicode安全的 –

+0

这种方法有什么错? – immerhart

1

问题是不支持从小写转换为大写的情况Java.util.regex.Pattern 这意味着您需要按照Brian的建议以编程方式进行转换。另请参阅this thread

+0

为什么这么说:“(?<= _)(\ w)”而不是:“_ \ w”? – immerhart

+1

请再次注意,正则表达式可能不是你正在寻找的。但仅供参考,'_ \ w'匹配下面的下划线和字母字符,而'(?<= _)(\ w)'只匹配字母字符。 – cooltea

+0

是的,'_ \ w'消耗下划线,但那又如何?无论如何,你并没有保留它,而你正在捕获这封信。即使你可以使用这个正则表达式,lookbehinds也是无关紧要的。 (只是你知道,'\ w'匹配下划线和数字以及字母。) –