正则表达式删除与表达式不匹配的字符

时间:2019-07-02 09:34:10

标签: javascript regex

我有这个正则表达式 get() 在“ 32086073S”上使用时,字母S被删除。 这是我用来测试的代码: let nonAlphaNumeric = /[\W_]/gi;

编辑:在测试中添加了。

下划线和i一起匹配S并将其删除,为什么?

测试网址:regexr.com/4gpit

2 个答案:

答案 0 :(得分:0)

此行为是一个错误,因为/[\W_]/i 不应该匹配Ss

请参见ECMA documentation

  

在不区分大小写的匹配中,在比较它们之前,所有字符都会隐式转换为大写。但是,如果将字符转换为大写字母会将该字符扩展为多个字符(例如将"ß"\u00DF)转换为"SS"),则该字符将保持原样代替。如果该字符不是ASCII字符,也将保持原样,但将其转换为大写字母将使其变为ASCII字符。这样可以防止诸如\u0131\u017F之类的Unicode字符与诸如/[a‑z]/i之类的正则表达式相匹配,后者仅用于匹配ASCII字母。此外,如果允许这些转换,则/[^\W]/i将与ab,…,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。我刚刚安装了它,并确认它已修复该错误。