我有这个正则表达式
get()
在“ 32086073S”上使用时,字母S被删除。
这是我用来测试的代码:
let nonAlphaNumeric = /[\W_]/gi;
编辑:在测试中添加了。
下划线和i一起匹配S并将其删除,为什么?
测试网址:regexr.com/4gpit
答案 0 :(得分:0)
此行为是一个错误,因为/[\W_]/i
不应该匹配S
或s
。
在不区分大小写的匹配中,在比较它们之前,所有字符都会隐式转换为大写。但是,如果将字符转换为大写字母会将该字符扩展为多个字符(例如将
"ß"
(\u00DF
)转换为"SS"
),则该字符将保持原样代替。如果该字符不是ASCII字符,也将保持原样,但将其转换为大写字母将使其变为ASCII字符。这样可以防止诸如\u0131
和\u017F
之类的Unicode字符与诸如/[a‑z]/i
之类的正则表达式相匹配,后者仅用于匹配ASCII字母。此外,如果允许这些转换,则/[^\W]/i
将与a
,b
,…,h
中的每一个匹配,但不会与i
或{{1} }。
正确的行为:s
必须与任何char匹配,但不能匹配单词char(ASCII字母,数字和[\W_]
)或_
。
答案 1 :(得分:0)
似乎您偶然发现了Chrome 75(自内部版本75.0.3756.0起)中的最新错误/回归。可以在Issue 972850: RegExp /[\W_]/gi matches the letter S上找到错误报告:
"RST".replace(/[\W_]/gi, "");
预期的行为是什么?
输出为“ RST”。出了什么问题?
输出为“ RT”。
该问题已与Issue 971636: regex /ſ/i (U+017F) matches a normal s (U+0073)合并。一个Chromium项目成员在第二个线程的注释#13中发现了类似的情况:
哼...
"S".match(/[\W]/i)
空
"S".match(/[a\W]/i)
[“ S”,索引:0,输入:“ S”,组:未定义]
请注意,/[a\W]/i
只是您的情况的一个变体:该错误并非特定于下划线:一旦在\w
中的类中添加了字符,它就会发生。例如,/[x\W]/i
,/[,.\W#j]/i
也会触发此问题。 g
标志与问题无关,并且当您使用u
修饰符时,问题消失了。
无论如何,这里的重要新闻是该错误已得到确认,并已在Chromium 76和75版的bug中修复。
如果您不担心beta版本,可以download the beta,在撰写本文时为76.0.3809.46。我刚刚安装了它,并确认它已修复该错误。