Regex удаляет символ, который не соответствует выражению - PullRequest
1 голос
/ 02 июля 2019

У меня есть это регулярное выражение let nonAlphaNumeric = /[\W_]/gi; При использовании его на «32086073S» буква S удаляется. Это код, который я использую для тестирования: "3208S6073OS".replace(/[\W_]/gi, '');

edit: добавлено s в тесте.

Подчеркивание и i в сочетании совпадают с S и удаляют его, почему?

тестовый URL: regexr.com/4gpit

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Кажется, вы наткнулись на недавнюю ошибку / регрессию в Chrome 75 (начиная с версии 75.0.3756.0).Отчет об ошибке можно найти по адресу Проблема 972850: RegExp / [\ W _] / gi соответствует букве S :

"RST".replace(/[\W_]/gi, "");

Какое поведение ожидается?
Выход "RST".

Что пошло не так?
Вывод «RT».

Проблема объединена с Проблема 971636: регулярное выражение / ſ / i (U + 017F) соответствует нормальному s (U + 0073) .Участник проекта Chromium замечает похожий случай в комментарии № 13 к этой второй теме:

гул ...
"S".match(/[\W]/i)

null

"S".match(/[a\W]/i)

["S", индекс: 0, ввод: "S", группы: undefined]

Обратите внимание, что/[a\W]/i - это просто вариант для вашего случая: ошибка не относится к подчеркиванию: это происходит, как только вы добавляете символ в класс, который находится в \w.Например, /[x\W]/i, /[,.\W#j]/i также вызывают проблему.Флаг g не связан с проблемой, и когда вы используете модификатор u, проблема исчезает.

В любом случае, важными новостями здесь является то, что ошибка была подтверждена и исправлена ​​в Chromium 76и, возможно, в выпуске 75 ошибок.

Если вы не боитесь бета-релизов, вы можете загрузить бета-версию , которая на момент написания статьи составляла 76.0.3809.46.Я установил его только сейчас и подтверждаю, что он исправляет ошибку.

0 голосов
/ 02 июля 2019

Поведение является ошибкой, поскольку /[\W_]/i не должно соответствовать S, а также s.

См. Документацию ECMA :

В несущественных совпадениях все символы неявно преобразуются в верхний регистр непосредственно перед их сравнением.Однако, если преобразование символа в верхний регистр расширит этот символ более чем на один символ (например, преобразование "ß" (\u00DF) в "SS"), вместо этого символ останется как есть.Символ также остается как есть, если он не является символом ASCII, но преобразование его в верхний регистр сделает его символом ASCII.Это препятствует тому, чтобы символы Юникода, такие как \u0131 и \u017F, соответствовали регулярным выражениям, таким как /[a‑z]/i, которые предназначены только для соответствия буквам ASCII.Кроме того, если бы эти преобразования были разрешены, то /[^\W]/i будет соответствовать каждому из a, b,…, h, но не i или s.

Правильноповедение: [\W_] должно соответствовать любому символу, кроме слова char (буквы ASCII, цифры и _) или _.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...