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
Извиняюсь за то, что добавил это как ответ, а не как комментарий (пока не набрал достаточно репутации, чтобы добавить новый комментарий). Речь идет о проверке правильности использования 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