通用解决方案
Mathias Bynens 建议遵循UTS18 http://unicode.org/reports/tr18/#word推荐,从而实现 Unicode 感知\W
看起来像:
[^\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]
请注意建议的 Unicode 属性类组合的注释:
这只是字边界的近似值(参见b http://unicode.org/reports/tr18/#b以下)。这
为编程语言添加了连接器标点符号
标识符,从而添加“_”和类似的字符。
更多注意事项
The \w
构造(因此它的\W
当在 Unicode 感知上下文中匹配时,在正则表达式引擎中匹配相似但有些不同的字符集。
例如,这里是非单词字符:\W https://learn.microsoft.com/en-us/dotnet/standard/base-types/character-classes-in-regular-expressions#non-word-character-w.NET 定义:[^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Mn}\p{Pc}\p{Lm}]
, where \p{Ll}\p{Lu}\p{Lt}\p{Lo}
可以收缩到纯粹\p{L}
因此该模式等于[^\p{L}\p{Nd}\p{Mn}\p{Pc}]
.
在 Android 中(请参阅文档 https://developer.android.com/reference/java/util/regex/Pattern#unicode-support), [^\p{Alpha}\p{gc=Mn}\p{gc=Me}\p{gc=Mc}\p{Digit}\p{gc=Pc}\p{IsJoin_Control}]
, where \p{gc=Mn}\p{gc=Me}\p{gc=Mc}
可以写成\p{M}
.
在 PHP PCRE 中,\W
火柴[^\p{L}\p{N}_]
.
Reexegg 备忘单 https://www.rexegg.com/regex-quickstart.html#classes定义Python 3\w
as "Unicode 字母、表意文字、数字或下划线", i.e. [\p{L}\p{Mn}\p{Nd}_]
.
你可以大致分解一下\W
as [^\p{L}\p{N}\p{M}\p{Pc}]
:
/[^\p{L}\p{N}\p{M}\p{Pc}]/gu
where
-
[^
- is the start of the negated character class that matches a single char other than:
-
\p{L}
- 任何 Unicode 字母
-
\p{N}
- 任何 Unicode 数字
-
\p{M}
- 变音符号
-
\p{Pc}
- 连接器标点符号
-
]
- 字符类结束。
注意是\p{Pc}
与下划线匹配的类。
NOTE that \p{Alphabetic}
(\p{Alpha}
) 包括所有匹配的字母\p{L}
, plus 字母数字匹配于\p{Nl}
(e.g. Ⅻ
– 罗马数字的字符12
),加上一些其他匹配的符号\p{Other_Alphabetic}
(\p{OAlpha}
).
其他变化:
-
/[^\p{L}0-9_]/gu
- 只是使用\W
仅识别 Unicode 字母
-
/[^\p{L}\p{N}_]/gu
- (PCRE\W
样式)即可使用\W
只识别 Unicode 字母和数字。
请注意,Java 的(?U)\W
将匹配什么的混合\W
匹配 PCRE、Python 和 .NET。