![](/img/trans.png)
[英]Case-insensitive POSIX regex is not case-insensitive in Java Pattern & Matcher
[英]Is Java RegEx case-insensitive?
在 Java 中,當執行 replaceAll 以查找正則表達式模式時,例如:
replaceAll("\\?i\\b(\\w+)\\b(\\s+\\1)+\\b", "$1");
(刪除重復的連續不區分大小寫的單詞,例如測試測試),我不確定我把?i
放在?i
。 我讀到它應該在開頭,但如果我把它拿出來,我會發現重復的連續單詞(例如 test test),但不是不區分大小寫的單詞(例如 Test test)。 所以我想我可以在開頭添加 ?i ,但這似乎並沒有完成工作。 有什么想法嗎? 謝謝!
您還可以匹配不區分大小寫的正則表達式,並通過使用 Pattern.CASE_INSENSITIVE 常量使其更具可讀性,例如:
Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
Matcher mymatcher= mypattern.matcher(mystring);
RegexBuddy告訴我是否要在開頭包含它,這是正確的語法:
"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
是的,可以在 Java 正則表達式中隨意啟用和禁用不區分大小寫。
看起來你想要這樣的東西:
System.out.println(
"Have a meRry MErrY Christmas ho Ho hO"
.replaceAll("(?i)\\b(\\w+)(\\s+\\1)+\\b", "$1")
);
// Have a meRry Christmas ho
請注意,嵌入的Pattern.CASE_INSENSITIVE
標志是(?i)
而不是\\?i
。 另請注意,已從模式中刪除了一個多余的\\b
。
(?i)
放置在模式的開頭以啟用不區分大小寫。 在這種特殊情況下,它不會在模式的后面被覆蓋,因此實際上整個模式是不區分大小寫的。
值得注意的是,實際上您可以將不區分大小寫限制為僅對整個模式的一部分。 因此,將它放在哪里的問題實際上取決於規范(盡管對於這個特定問題,它並不重要,因為\\w
不區分大小寫。
為了演示,這里有一個類似的例子,將像"AaAaaA"
類的字母折疊成"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
更一般地說,您可以根據需要啟用和禁用模式中的任何標志。
java.util.regex.Pattern
/regex/i
(Java中的Pattern.CASE_INSENSITIVE
),你可以做/(?i)regex/
/first(?i)second(?-i)third/
/first(?i:second)third/
\\w
和 a \\s
之間總是有一個\\b
)如果您的整個表達式不區分大小寫,則只需指定CASE_INSENSITIVE
標志:
Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
您還可以將要檢查模式匹配的初始字符串引導為小寫。 並分別在您的模式中使用小寫符號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.