在 python 或 PHP 中,一个简单的正则表达式,例如 /\W/gu
匹配任何脚本中的任何非单词字符,但在 javascript 中匹配 [^A-Za-z0-9_]
,与python和PHP匹配相同字符的正确范围是多少?
https://regex101.com/r/yhNF8U/1/
最佳答案
通用解决方案
Mathias Bynens 建议关注 UTS18推荐,因此可以识别 Unicode \W
看起来像:
[^\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]
请注意建议的 Unicode 属性类组合的注释:This is only an approximation to Word Boundaries (see b below). The Connector Punctuation is added in for programming language identifiers, thus adding "_" and similar characters.
更多注意事项
\w
构造(因此它的 \W
对应物)在 Unicode 感知上下文中进行匹配时,在正则表达式引擎中匹配相似但有些不同的字符集。例如,这里是 Non-word character:
\W
.NET 定义:[^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Mn}\p{Pc}\p{Lm}]
, 其中 \p{Ll}\p{Lu}\p{Lt}\p{Lo}
可以承包到一个纯粹的\p{L}
因此模式等于[^\p{L}\p{Nd}\p{Mn}\p{Pc}]
.在 Android 中(参见 documentation),
[^\p{Alpha}\p{gc=Mn}\p{gc=Me}\p{gc=Mc}\p{Digit}\p{gc=Pc}\p{IsJoin_Control}]
, 其中 \p{gc=Mn}\p{gc=Me}\p{gc=Mc}
可以写成\p{M}
.在 PHP PCRE 中,
\W
匹配 [^\p{L}\p{N}_]
.Rexegg cheat sheet定义 Python 3
\w
作为“Unicode 字母、表意文字、数字或下划线”,即 [\p{L}\p{Mn}\p{Nd}_]
.你可以粗略分解
\W
作为[^\p{L}\p{N}\p{M}\p{Pc}]
:/[^\p{L}\p{N}\p{M}\p{Pc}]/gu
在哪里[^
- 是匹配单个字符的否定字符类的开始,而不是:\p{L}
- 任何 Unicode 字母 \p{N}
- 任何 Unicode 数字 \p{M}
- 变音符号 \p{Pc}
- 连接符标点符号]
- 字符类结束。 注意它是
\p{Pc}
匹配下划线的类。注意 那
\p{Alphabetic}
( \p{Alpha}
) 包括与 \p{L}
匹配的所有字母, 加上与 \p{Nl}
匹配的字母数字(例如 Ⅻ
– 罗马数字的字符 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 中匹配。
关于javascript - javascript 正则表达式匹配任何脚本中所有非单词字符的正确正则表达式范围是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62772641/