正则expression式将CamelCase转换为java中的camel_case
我明白为什么不使用正则expression式将Foo_Bar
这样的stringFooBar
为Foo_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_$2
replace(.)([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); } }