Chrome 75正则表达式,“ S”匹配奇怪的unicode范围

rom*_*ald 8 javascript google-chrome

我们在最新版本的Chrome(75)上有一个奇怪的错误,该错误已替换SS

console.log(
  'AZERTYUIOPQSDFGHJKLMWXCVBN'.replace(/[\u00A0-\u9999<>&]/gim, char => `&#${char.charCodeAt(0)};`)
)  
Run Code Online (Sandbox Code Playgroud)

//AZERTYUIOPQ&#83;DFGHJKLMWXCVBN

有人知道代码是问题还是Chrome是问题?

Jos*_*Lee 5

已在75.0.3770.142中修复。


您发现了一个有趣的错误:

由于某些原因取决于无关的字符范围,因此这两个测试是正确的:

> /[\u0178-\u017F]/i.test('s')
true
> /[\u0178-\u017F]/i.test('S')
true
Run Code Online (Sandbox Code Playgroud)

https://chromium-review.googlesource.com/c/v8/v8/+/1478710(四月)引入。

https://chromium-review.googlesource.com/c/v8/v8/+/1648098中的修复程序似乎与之相关,但是带有v8 7.7.27的Canary 77.0.3818.0仍然表现出此行为。这是一个单独的错误:https : //crbug.com/971636

引入该问题的错误(https://bugs.chromium.org/p/v8/issues/detail?id=8348)讨论了ECMAScript的处理方式iu不同之处:

  • i单独调用toUpperCase,使用案例映射
  • iu调用Unicode大小写折叠

这些稍有不同(尽管有此错误)。

我还发现了似乎是一个不同的错误:

这是一个小测试用例,尽管v8中的修复程序涉及土耳其的案例折叠:

> text='?';
"?"
> new RegExp(text, 'i').test(text.toUpperCase())
true
> new RegExp(text, 'i').test('S')
false
Run Code Online (Sandbox Code Playgroud)

它是在同一修订版中引入的,但它不是完全相同的错误-它特定于?字符,其大写版本位于ASCII范围内,因此会在V8的regexp编译器中触发不同的代码路径。在https://chromium-review.googlesource.com/c/v8/v8/+/1827683上单独修复