[英]Case-insensitive POSIX regex is not case-insensitive in Java Pattern & Matcher
我不是Regex的專家,可能是顯而易見的原因,但是我找不到答案。
我使用POSIX表示法,以不區分大小寫的方式在Java中使用Regex匹配字符串( n
)。 鑒於:
Pattern pattern = Pattern.compile("\\p{Upper}", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("n");
為什么以下代碼導致false
?
boolean find = matcher.find();
在Pattern
文檔中,我發現了以下內容(強調了我的意思):
\\ p {Upper}大寫字母字符: [AZ]
經過Regex [AZ]
測試,以下結果為true
:
Pattern pattern = Pattern.compile("[A-Z]", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("n");
boolean find = matcher.find();
有什么區別?
無論是對還是錯-Posix字符類都會忽略CASE_INSENSITIVE
標志。 盡管\\p{Upper}
作用類似於[AZ]
,但它並不完全相同-也不考慮不區分大小寫的標志。
Pattern
類中用於檢查posic字符類的代碼未引用CASE_INSENSITIVE
標志:
/**
* Node class that matches a POSIX type.
*/
static final class Ctype extends BmpCharProperty {
final int ctype;
Ctype(int ctype) { this.ctype = ctype; }
boolean isSatisfiedBy(int ch) {
return ch < 128 && ASCII.isType(ch, ctype);
}
}
從POSIX規范(IEEE 1003):
9.2正則表達式一般要求
當使用正則表達式的標准實用程序或函數指定執行模式匹配時,不考慮數據或模式的大小寫(大寫或小寫),則當字符串中的每個字符都與模式匹配時,不僅字符,也應匹配其對應的案子(如果有)。
使用POSIX字符類時, Pattern.CASE_INSENSITIVE
不會使其忽略大小寫對應檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.