2015-03-23 7 views
0

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

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' 

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

+1

Укажите примеры ввода и ожидаемые совпадения. – anubhava

+0

Почему «черная кошка» не соответствует? Каковы правила? –

+0

Являются ли скобки частью строки или это иллюстрирует ваш вопрос? Какие правила вы хотите использовать на простом английском языке? Каков вклад ожидаемого вывода, который вы опубликовали? – sebnukem

ответ

1

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

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

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

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

RegEx Demo

0

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