Правила сопоставления чисел в отслеживаемых словах

Как показано на рисунке ниже, совпадающие слова — это «Test», «123» и «测试» (что означает «Test» на упрощённом китайском).

При успешном совпадении любое число, непосредственно предшествующее совпавшему слову, включается в результат совпадения; это правило действует даже для символов Unicode.
Числа, непосредственно следующие за совпавшим словом, не подчиняются этому поведению.
Это также влияет на совпадение чисел, включая случаи, когда строки состоят исключительно из английских букв и цифр. Например, «Test123» может совпасть только с «Test», но не с «123» или «Test123» (самим собой).

Возможно, я немного отстал от новостей — какой это тип правила совпадения? Кто-нибудь может объяснить? :melting_face:

1 лайк

Похоже на возможную ошибку в регулярном выражении, которые всегда немного сложно отлаживать. @zogstrip, может, ты сможешь взглянуть, раз ты недавно работал в этой области (хотя, похоже, эта проблема существует уже давно).

Вот моё понимание…

Когда мы проверяем слова, должны совпадать три сегмента: ведущий, само слово и завершающий. Мы установили ведущий и завершающий сегменты как символы, отличные от букв… это могут быть знаки препинания, пробелы или цифры. Именно цифры сбивают совпадение в данном случае. Идея заключалась в том, чтобы находить слова даже если перед/после них есть знаки препинания или что-то ещё.

Так вот, регулярное выражение видит 123Test, находит Test, смотрит перед ним и находит 3, что соответствует «символу, отличному от буквы», затем смотрит после и находит конец слова. Таким образом, совпадение происходит по 3Test.

Думаю, нам нужно проверять наличие символов, отличных от букв и цифр, в ведущем и завершающем сегментах, чтобы избежать этого? Не уверен, есть ли причина, по которой мы не включили цифры, или это просто упущение.

2 лайка

Возможно, эту тему стоит перенести в категорию #баг?

1 лайк

На этот раз это должно решить проблему раз и навсегда. У нас была некоторая несогласованность между версиями регулярных выражений на Ruby и JS, но теперь это больше не требуется.

3 лайка