Java RegEx是否区分大小写?
在Java中,当执行replaceAll查找正则expression式模式时:
replaceAll("\\?i\\b(\\w+)\\b(\\s+\\1)+\\b", "$1");
(删除重复的连续不区分大小写的单词,例如testingtesting),我不知道我把它放在哪里。 我读到它应该是在开始,但是如果我把它拿出来,然后我抓住重复连续的单词(如testingtesting),但不区分大小写的话(如testingtesting)。 所以我想我可以在开始的时候添加?i,但是这似乎不能完成这项工作。 有什么想法吗? 谢谢!
RegexBuddy告诉我,如果你想把它包括在开头,这是正确的语法:
"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
是的,可以在Java正则expression式中随意启用和禁用不区分大小写。
看起来你想要这样的东西:
System.out.println( "Have a meRry MErrY Christmas ho Ho hO" .replaceAll("(?i)\\b(\\w+)(\\s+\\1)+\\b", "$1") ); // Have a meRry Christmas ho
请注意embedded的 Pattern.CASE_INSENSITIVE
标志是(?i)
不是\?i
。 还要注意,一个多余的\b
已经从模式中删除。
(?i)
放置在模式的开始处以启用不区分大小写。 在这种特殊情况下,它在模式后面不会被覆盖,所以实际上整个模式是不区分大小写的。
值得注意的是,事实上,您可以将大小写不敏感仅限于整个模式的一部分。 因此,把它放在什么地方的问题真的取决于规范(尽pipe对于这个特定的问题,这并不重要,因为\w
是不区分大小写的。
为了演示,下面是一个类似"AaAaaA"
字母"AaAaaA"
为"A"
例子。
System.out.println( "AaAaaA eeEeeE IiiIi OoooOo uuUuUuu" .replaceAll("(?i)\\b([AZ])\\1+\\b", "$1") ); // A e IO u
现在假设我们指定运行只有在以大写字母开头时才能被折叠。 那么我们必须把(?i)
放在适当的地方:
System.out.println( "AaAaaA eeEeeE IiiIi OoooOo uuUuUuu" .replaceAll("\\b([AZ])(?i)\\1+\\b", "$1") ); // A eeEeeE IO uuUuUuu
更一般地说,您可以根据需要启用和禁用模式中的任何标志。
也可以看看
-
java.util.regex.Pattern
- regular-expressions.info/Modifiers
- 指定正则expression式中的模式
- 而不是
/regex/i
(Java中的Pattern.CASE_INSENSITIVE
),你可以做/(?i)regex/
- 而不是
- 只有正则expression式的一部分打开和closures模式
- 你也可以
/first(?i)second(?-i)third/
- 你也可以
- 修饰符跨度
- 你也可以做
/first(?i:second)third/
- 你也可以做
- 指定正则expression式中的模式
- regular-expressions.info/Word边界 (在
\w
和\s
之间总是有一个\b
)
相关问题
- 你可以只是正则expression式不区分大小写的一部分?
- 区分大小写,不区分大小写
你也可以匹配不区分大小写的正则expression式,并通过使用Pattern.CASE_INSENSITIVE常量来使其更具可读性:
Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE); Matcher mymatcher= mypattern.matcher(mystring);
如果您的整个expression式不区分大小写,您可以指定CASE_INSENSITIVE标志。
http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
您也可以将您要检查模式匹配的初始string引导至小写字母。 并分别在你的模式中使用小写符号。