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()
сделать это.