正则expression式将CamelCase转换为java中的camel_case

我明白为什么不使用正则expression式将Foo_Bar这样的stringFooBarFoo_Bar ,而是给出Foo_Bar_ 。 我可以用String.substring substring(0, string.length() - 2)做一些事情,或者只是replace最后一个字符,但我认为有一个更好的解决scheme,这种情况。

这里是代码:

 String regex = "([AZ][az]+)"; String replacement = "$1_"; "CamelCaseToSomethingElse".replaceAll(regex, replacement); /* outputs: Camel_Case_To_Something_Else_ desired output: Camel_Case_To_Something_Else */ 

问题:寻找一个更好的方法来获得所需的输出?

从番石榴看到这个问题和CaseFormat

在你的情况下,像这样的东西:

 CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, "SomeInput"); 

将小写字母和大写字母作为两组绑定,就可以了

 public class Main { public static void main(String args[]) { String regex = "([az])([AZ]+)"; String replacement = "$1_$2"; System.out.println("CamelCaseToSomethingElse" .replaceAll(regex, replacement) .toLowerCase()); } } 

你可以使用下面的代码片段:

 String replaceAll = key.replaceAll("(.)(\\p{Upper})", "$1_$2").toLowerCase(); 

为什么不简单地匹配先前的字符作为不行$开始?

 String text = "CamelCaseToSomethingElse"; System.out.println(text.replaceAll("([^_A-Z])([AZ])", "$1_$2")); 

请注意,这个版本可以安全地在已经是骆驼的东西上执行。

添加一个零宽度的前瞻断言。

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

阅读(?=X)的文档

就我个人而言,我实际上将拆分string,然后重新组合它。 如果做得对,这可能会更快,这使得代码比正则expression式更容易理解。 不要误解我的意思:我喜欢正则expression式。 但这并不是一个简洁的正则expression式,也不是一个经典的正则expression式任务。 毕竟看来你还想做小写字母?

一个丑陋的,但快速的黑客将是用$1_$2replace(.)([AZ]+) ,然后小写整个string(除非你可以做perl样式extrended正则expression式,你可以直接小写replace!)。 尽pipe如此,我仍然认为这是从低层到高层的过渡,然后转变,然后join,作为这样做的正确和最可读的方式。

 ([AZ][az\d]+)(?=([AZ][az\d]+)) 

应该search大写字母,后跟小写字母。 积极的向前看将寻找另一个字母大写字母开头,后面是小写字母,但不会将其包括在匹配中。

看这里: http : //regexr.com?30ooo

 public class ReplaceFromCameltoSnake { public static void main(String args[]){ String s1=" totalAmountWithoutDiscount"; String replaceString=s1.replaceAll("([AZ]+)","\\_$1").toLowerCase(); System.out.println(replaceString); } }