我们都知道,在Perl中,正则表达式要做到大小写无关,可以使用如下表示:
/Regex/i
那么Java中如何使正则匹配大小写无关呢?最常用的写法如下:
Pattern pattern
=Pattern.compile(Regex,Pattern.CASE_INSENSITIVE);
但是有些情况下,需要正则表达式字符串本身包含大小写无关的定义。比如replaceAll函数,要按照大小写无关去替换怎么办呢?可以采取/Regex/i的等价表达形式:
/(?i)Regex/
这样,就可以将“(?i)Regex”作为replaceAll的第一个参数去进行替换了。
还可以使某段内容按大小写无关匹配:
/first(?i)second(?-i)third/
或者采用以下等价的格式也可以:
/first(?i:second)third/
以下例子讲示范如何将"AaAaaA"b"A".
System.out.println(
"AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
.replaceAll("(?i)\\b([A-Z])\\1+\\b", "$1")
); // A e I O u
进一步地,如果我们只想把以大写字母开头的字符串替换成单个字符,可以改变(?i)的作用域,采用以下写法:
System.out.println(
"AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
.replaceAll("\\b([A-Z])(?i)\\1+\\b", "$1")
); // A eeEeeE I O uuUuUuu
其他知识点:
\1 代表第一个括号中已经匹配上的内容
\b
代表单词边界。何为单词边界,一个牛x哄哄又无懈可击的定义如下:
\b匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在)\w(匹配字母或数字或下划线或汉字)”
\w
代表单词,且与大小写无关。何为单词,上面已经说明,字母或数字或下划线或汉字
正则表达式博大精深,掌握好它一行可以干别人一段代码干的事。