Я ищу, чтобы найти совпадение ключевых слов в строке. Я пытаюсь использовать границу слов, но это может быть не лучшим решением для этого решения. Ключевое слово может быть любым словом, и ему может предшествовать символ без слова. Строка может быть любой строкой и может включать в себя все три этих слова в массиве, но я должен соответствовать только ключевому слову:
['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
но только один будет точнымВы должны учитывать три вещи здесь:
\b
является контекстно-зависимой конструкцией, и если ваш вход не всегда буквенно-цифровой, вам нужны недвусмысленные границы словиспользование
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.Убедитесь, что ключевое слово уже начинается со специального символа. Если это так, не включайте его в регулярное выражение.
var re;
if ("#@".indexOf(keyword[0]) == -1) {
re = new RegExp('[@#]?\b${keyword}\b');
} else {
re = new RegExp('\b${keyword}\b');
}
new RegExp(`(^|\\W)(${keyword})(?!\\w)`)
. Вы извлекаете или заменяете? Или просто тестирование на совпадение?/
при использованииnew RegExp