javascript 正则表达式匹配任何脚本中所有非单词字符的正确正则表达式范围是多少?

Posted

技术标签:

【中文标题】javascript 正则表达式匹配任何脚本中所有非单词字符的正确正则表达式范围是多少?【英文标题】:What's the correct regex range for javascript's regexes to match all the non word characters in any script? 【发布时间】:2020-07-07 09:56:11 【问题描述】:

在 python 或 php 中,一个简单的正则表达式,如 /\W/gu 匹配任何脚本中的任何非单词字符,但在 javascript 中它匹配 [^A-Za-z0-9_],匹配与 python 和 PHP 相同的字符的正确范围是多少?

https://regex101.com/r/yhNF8U/1/

【问题讨论】:

@Mandy8055 我想匹配除单词之外的任何字符,就像它在 php 和 python 中一样(如果您单击 regex101 链接,您可以看到不同的语言如何匹配该 regex) 您可以在regexpal上测试以下字符属性 【参考方案1】:

通用解决方案

Mathias Bynens 建议遵循 UTS18 建议,因此可识别 Unicode 的 \W 将如下所示:

[^\pAlphabetic\pMark\pDecimal_Number\pConnector_Punctuation\pJoin_Control]

请注意建议的 Unicode 属性类组合的注释:

这只是字边界的近似值(参见下面的b)。这 为编程语言添加了连接符标点符号 标识符,因此添加“_”和类似字符。

更多注意事项

\w 构造(以及它的 \W 对应物)在可识别 Unicode 的上下文中匹配时,在正则表达式引擎中匹配相似但略有不同的字符集。

例如,这里是Non-word character: \W .NET 定义:[^\pLl\pLu\pLt\pLo\pNd\pMn\pPc\pLm],其中\pLl\pLu\pLt\pLo 可以收缩为纯粹的\pL,因此模式等于[^\pL\pNd\pMn\pPc]

android中(见documentation),[^\pAlpha\pgc=Mn\pgc=Me\pgc=Mc\pDigit\pgc=Pc\pIsJoin_Control],其中\pgc=Mn\pgc=Me\pgc=Mc可以写成\pM

在 PHP PCRE 中,\W 匹配 [^\pL\pN_]

Rexegg cheat sheet 将 Python 3 \w 定义为“Unicode 字母、表意文字、数字或下划线”,即[\pL\pMn\pNd_]

你可以将\W大致分解为[^\pL\pN\pM\pPc]

/[^\pL\pN\pM\pPc]/gu

在哪里

[^ - 是匹配单个字符的否定字符类的开始,而不是: \pL - 任何 Unicode 字母 \pN - 任何 Unicode 数字 \pM - 变音符号 \pPc - 连接符标点符号 ] - 字符类结束。

请注意,匹配下划线的是\pPc 类。

注意 \pAlphabetic (\pAlpha) 包括与\pL 匹配的所有字母,以及与\pNl 匹配的字母数字(例如 –罗马数字 12) 的字符,以及与 \pOther_Alphabetic (\pOAlpha) 匹配的一些其他符号。

其他变体:

/[^\pL0-9_]/gu - 只使用只知道 Unicode 字母的 \W /[^\pL\pN_]/gu - (PCRE \W 风格)只使用 \W,它只知道 Unicode 字母和数字。

请注意,Java 的 (?U)\W 将与 PCRE、Python 和 .NET 中的 \W 匹配。

【讨论】:

我不知道为什么这个答案被否决了;这不适用于 regex101,但它似乎适用于我的代码,我将在我的代码上对其进行更多测试,如果它适用于每一个合理的输入,我会接受它 @thelmuxkriovar regex101 不支持 JS 正则表达式风格的 Unicode 属性类。这是一个仅与 regex101 相关的错误。 @thelmuxkriovar 请检查this 问题。 解释得很好,而且一如既往地很有教育意义 ++ @Thefourthbird 不幸的是,它非常简洁。这个主题值得一整本书的章节。我之前做过测试,看看 Unicode-aware \w 在不同的引擎中匹配什么,但我丢失了大部分细节。主要思想是设计您自己的字符类,它只包含您需要的 Unicode 属性类。

以上是关于javascript 正则表达式匹配任何脚本中所有非单词字符的正确正则表达式范围是多少?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 正则

Javascript正则表达式:匹配任何东西直到某物(如果存在)

JavaScript正则表达式-替换所有匹配项?

Javascript - 正则表达式匹配任何数字,包括无穷大、负数和 e+/- 数字 [重复]

7.4 Javascript:表单验证-揭开正则表达式的面纱

7.4 Javascript:表单验证-揭开正则表达式的面纱