Javascript RegExp \b метасимвол с акцентированными символами

Добрый день,

В настоящее время я работаю над компонентом панели поиска, созданным в Javascript. Я хотел бы найти способ сохранить все строковые результаты, для которых по крайней мере одно слово начинается с префикса, полученного из входных данных.

Вот пример:

  • "Это пример" будет соответствовать такому виду ввода: "это", "это", "экс"... "

После некоторых исследований я нашел простой способ сделать это, используя метасимвол \b:

let _regex = new RegExp('\\b(inputValue)', 'gi'),
    _match = _regex.exec("My Full Sentence");

Честно говоря, это работает очень хорошо, если предложения не состоят из акцентированных символов. На самом деле, когда слово начинается с акцентированного символа, метасимвол \b работает не так, как задумано.

Например:

  • "Левитер" будет правильно совпадать с "Левитером"
  • "éviter" будет странным образом совпадать с "léviter"
  • "éviter", как ни странно, не будет совпадать с "éviter"

Я создал JSFiddle с большим количеством примеров: https://jsfiddle.net/9L7vee46/46/

Таким образом, я хотел бы знать, существует ли решение для правильного поведения с использованием метасимвола \b.

Спасибо за помощь.

1 ответ

Нормализуйте и ваш текст, и строку поиска, чтобы использовать одинаковый тип акцентированного символа.

В Юникоде по историческим причинам для некоторых символов есть два разных типа акцентированных символов: одна кодовая точка и несколько кодовых точек. Ваша библиотека регулярных выражений обрабатывает их по-разному, потому что на самом деле они разные. Перед поиском выберите один и замените его другим для каждого случая неоднозначности (читай: для каждого символа, для которого есть две кодировки).

В ES6 вы можете использовать "".normalize() сделать это.

Другие вопросы по тегам