Javascript Regex Word Boundary с необязательным несловесным символом

1

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

['hello', '#hello', '@hello'];

Вот мой код, который включает в себя попытку, найденную в сообщении:

let userStr = 'why hello there, or should I say #hello there?';

let keyword = '#hello';

let re = new RegExp('/(#\b${userStr})\b/');

re.exec(keyword);
  • Это было бы здорово, если строка всегда начиналась С#, но это не так.
  • Затем я попробовал это /(#?\b${userStr})\b/, но если строка начинается с #, она пытается сопоставить ##hello.
  • matchThis str может быть любым из трех примеров в массиве, а userStr может содержать несколько вариантов matchThis но только один будет точным
  • 0
    Вам нужно что-то вроде new RegExp(`(^|\\W)(${keyword})(?!\\w)`) . Вы извлекаете или заменяете? Или просто тестирование на совпадение?
  • 0
    Вы не включаете разделители / при использовании new RegExp
Показать ещё 10 комментариев
Теги:
word-boundary

2 ответа

1
Лучший ответ

Вы должны учитывать три вещи здесь:

  • Главное, что граница слова \b является контекстно-зависимой конструкцией, и если ваш вход не всегда буквенно-цифровой, вам нужны недвусмысленные границы слов
  • Вам нужно удвоить выделение специальных символов внутри конструктора RegExp
  • Когда вы передаете переменную в регулярное выражение, вам нужно убедиться, что все специальные символы правильно экранированы.

использование

let userStr = 'why hello there, or should I say #hello there?';
let keyword = '#hello';
let re_pattern = '(?:^|\\W)(${keyword.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')})(?!\\w)';
let res = [], m;

// To find a single (first) match
console.log((m=new RegExp(re_pattern).exec(userStr)) ? m[1] : "");

// To find multiple matches:
let rx = new RegExp(re_pattern, "g");
while (m=rx.exec(userStr)) {
    res.push(m[1]);
}
console.log(res);

Описание шаблона

  • (?:^|\\W) - не захватывающая строка, соответствующая началу строки или любому негладному символу
  • (${keyword.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')}) - Группа 1: значение ключевого слова с экранированным специальные символы
  • (?!\\w) - отрицательный результат, который не соответствует совпадению, если рядом с текущим местоположением имеется слово char.
-1

Убедитесь, что ключевое слово уже начинается со специального символа. Если это так, не включайте его в регулярное выражение.

var re;
if ("#@".indexOf(keyword[0]) == -1) {
    re = new RegExp('[@#]?\b${keyword}\b');
} else {
    re = new RegExp('\b${keyword}\b');
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню