wil*_*iam 6 java regex unicode
首先,我想删除字符串中的所有标点符号。我写了下面的代码。
\nPattern pattern = Pattern.compile("\\\\p{Punct}");\nMatcher matcher = pattern.matcher("!\\"#$%&\'()*+,-./:;<=>?@[\\\\]^_`{|}~\xef\xbc\x88hello\xef\xbc\x89");\nif (matcher.find())\n System.out.println(matcher.replaceAll(""));\n
Run Code Online (Sandbox Code Playgroud)\n替换后我得到了这个输出:\xef\xbc\x88hello\xef\xbc\x89
。
!"#$%&\'()*+,-./:;<=>?@[\\]^_
因此该模式与{|}~`之一匹配,它与官方文档匹配。
但我也想删除“\xef\xbc\x88”Fullwidth Left Parenthesis U+FF08*
和“\xef\xbc\x89” Fullwidth Right Parenthesis U+FF09
,所以我将代码更改为:
Pattern pattern = Pattern.compile("(?U)\\\\p{Punct}");\n Matcher matcher = pattern.matcher("!\\"#$%&\'()*+,-./:;<=>?@[\\\\]^_`{|}~\xef\xbc\x88\xef\xbc\x89");\n if (matcher.find())\n System.out.println(matcher.replaceAll(""));\n
Run Code Online (Sandbox Code Playgroud)\n替换后,我得到以下输出:$+<=>^
|~`
它确实匹配了 "\xef\xbc\x88"Fullwidth Left Parenthesis U+FF08*
和 "\xef\xbc\x89" Fullwidth Right Parenthesis U+FF09
,但它错过了$+<=>^
|~`。
我感到很困惑。为什么会发生这种事?有人可以提供一些帮助吗?
\nUnicode(即当您使用 时(?U)
)和 POSIX(当您不使用 时(?U)
)对于标点符号的计算方式存在分歧。
当您不使用 时(?U)
,\\p{Punct}
匹配POSIX 标点字符类,这只是
!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~\n
Run Code Online (Sandbox Code Playgroud)\n当您使用(?U)
,\\p{Punct}
匹配Unicode 标点符号类别时,该类别不包括上面列表中的某些字符,即:
$+<=>^`|~\n
Run Code Online (Sandbox Code Playgroud)\n例如,Unicode 类别$
是“符号、货币”或 Sc。看这里。
如果你想匹配 $+<=>^`|~ 以及所有 Unicode 标点符号,你可以将它们都放在一个字符类中。您也可以直接使用 Unicode 类别“P”,而不用打开 Unicode 模式(?U)
。
Pattern pattern = Pattern.compile("[\\\\p{P}$+<=>^`|~]");\nMatcher matcher = pattern.matcher("!\\"#$%&\'()*+,-./:;<=>?@[\\\\]^_`{|}~\xef\xbc\x88\xef\xbc\x89");\n// you don\'t need "find" first\nSystem.out.println(matcher.replaceAll(""));\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
279 次 |
最近记录: |