public static String splitCamelCaseWithSpace(String string) {
        return string.replaceAll(
                String.format("%s|%s|%s",
                "(?<=[A-Z])(?=[A-Z][a-z])",
                "(?<=[^A-Z])(?=[A-Z])",
                "(?<=[A-Za-z])(?=[^A-Za-z])"),
                " ");
    }它的运行原理到底是怎样的?

解决方案 »

  1.   

    (?<=[A-Z])这缺东西吧(?=[A-Z][a-z])
      

  2.   

    String.format就不说了,
    整理之后就是:
    str.replaceAll("(?<=[A-Z])(?=[A-Z][a-z])|(?<=[^A-Z])(?=[A-Z])|(?<=[A-Za-z])(?=[^A-Za-z])","_");//这里为了效果明显,用_替换空格
    主要功能就是匹配到指定的格式后在这个指定位置的前面或者加一个空格,?就是匹配一个特定位置,这里匹配的是位置,也就是说其实不是替换,而且增加""
    ?=[A-Z]表明匹配的位置是字符满足[A-Z]的范围就可以了.比如"CCbB"就会被匹配三次,
    匹配后结果为_C_Cb_B
    ?=[A-Z][a-z]表明匹配Aa这样的字符串,前面大写,后面小写,"CCbB"就会匹配一次
    匹配后结果CC_bB
    大家可能注意到了,添加的_都是位于匹配位置的前面的,
    如果我想放到后面的话,那么就得
    ?<=[A-Z][a-z]这样了,
    这样的"CCbB"就会匹配一次匹配后结果就为CCb_B
    至于|就是或的意思,想必你也了解把。
    最后补充下,能写出这样正则的人真不容易,这样的正则的资料网上可真的不好搜。
      

  3.   

    这个方法made in U.S....
    您说的我大概能理解,当时这个方法解释为可以把“camleCase”变成“camle Case”这种形式。
    但是我还是有些地方不了解,希望指点一下。
    首先,为什么 ?<=[A-Z] 就可以实现增加,而不是替换?
    按照你的说法,应该是满足三个表达式的任意一个都是需要替换的,那如果出现冲突,怎么解决?例如
    ?=[A-Z]和?=[A-Z][a-z],那匹配的结果是_C_Cb_B还是CC_bB?