奇葩正则表达式求解
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])"),
" ");
}
它的运行原理到底是怎样的?
------解决方案--------------------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
至于
------解决方案--------------------就是或的意思,想必你也了解把。
最后补充下,能写出这样正则的人真不容易,这样的正则的资料网上可真的不好搜。