Regex для извлечения совпадений из нескольких слов из списка терминов

Я пытаюсь изменить следующее регулярное выражение (в javascript) из плагина glossarizer, чтобы сделать его менее снисходительным.

 var regex = new RegExp("(^s*|[^!])" + this.clean(term) + "\\s*|\\,$", "i");

Он пытается получить определение для термина в массиве терминов и определений JSON.

[{term: "black cat", definition: "a black cat"},
{term: "cat", definition: "meow"}]

Прямо сейчас это соответствует "черной кошке", когда я перехожу в "кошку", но я не хочу этого. Я хочу, чтобы он соответствовал тому, что начинается в начале строки или после запятой и */s и заканчивается либо запятой, либо концом строки, так что можно передать несколько определений.

*Match for cat:
'cat'
' Cat '
'cat, feline'
'feline, cat  , cheetah'

*Not a match for cat:
'black cat'
'Catapult'
'!cat'

Я пытался положить new RegExp("(^|^s*|[^!])" + this.clean(term) + "\\s*$|\\s*,", "i") (добавление каналов так, чтобы это было начало строки, ИЛИ запятая и пробел, и, таким образом, в конце это будет пробел, за которым следует запятая или конец строки, но это не дало желаемого эффекта (используя regex101.com, но в основном растерялся)

3 ответа

Возможно, вам лучше разделить список запятыми и отфильтровать результат. Регулярные выражения (особенно JS-флейм с отсутствием внешнего вида) плохо разбирают синтаксис, подобный этому.

terms = "feline, cat, cheetah";
if(terms.toLowerCase().split(", ").indexOf("cat") >= 0)
   // a cat was there!

Вы можете использовать это регулярное выражение для сопоставления ваших действительных случаев:

/(?:^|,) *\bcat(?= *(?:,|$))/gmi

RegEx Demo

Извиняюсь за то, что добавил это как ответ, а не как комментарий (пока не набрал достаточно репутации, чтобы добавить новый комментарий). Речь идет о проверке правильности использования JSON для плагина, потому что ваш список "не соответствует" меня смутил. Для "не совпадает" каждый отклоненный термин нуждается ! перед ним, так что JSON может быть

[
{
term: "black cat",
definition: "a black cat"
},
{
term: "!black cat, cat, !Catapult",  
definition: "meow"
}
] 

Это будет соответствовать всему слову cat в том числе с пунктуацией до или после, плюс ginger cat "кот в шляпе", "мой кот" и т. д., но не catastrophe или же cats, Если это то, что вы хотите, требуется только изменение json. RegEx в предыдущем ответе может быть больше, чем вы ищете, хотя.

После публикации вашего вопроса было сделано соответствующее обновление для разработчика, которое может быть полезным

Игнорировать в словах при получении описания терминов https://github.com/PebbleRoad/glossarizer/blob/master/jquery.glossarize.js

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