измените регулярное выражение, чтобы соответствовать некоторым словам вместо всех слов, содержащих PRP

#javascript #regex

#javascript #регулярное выражение

Вопрос:

Это регулярное выражение соответствует всем символам между пробелами, если слово содержит PRP .

Как я могу заставить его соответствовать всем словам или символам между пробелами, если они содержат PRP , но не если они содержат me в любом случае.

Так что сопоставьте все слова, содержащие PRP, но не содержащие ME или me.

Вот регулярное выражение для сопоставления слов, содержащих PRP: S*PRPS*

Комментарии:

1. можете ли вы предоставить некоторые входные данные вместе с ожидаемыми результатами?

Ответ №1:

Для этого вы можете использовать отрицательный прогноз:

 (?:^|s)((?!S*?(?:ME|me))S*?PRPS*)
  

Рабочая демонстрация

PS: Используйте group #1 для вашего совпадающего слова.

Код:

 var re = /(?:^|s)((?!S*?(?:ME|me))S*?PRPS*)/;    
var s = 'word abcPRP def';

var m = s.match(re);    
if (m) console.log(m[1]); //=> abcPRP
  

Комментарии:

1. спасибо, но он не работает на этом сайте тестирования регулярных выражений: regexr.com Я думаю, что есть непревзойденный паратезис

2. Проверьте последнее регулярное выражение и связанную демонстрацию.

3. на самом деле оно соответствует мне (PRP). Я хочу, чтобы оно соответствовало всем вещам, содержащим PRP, кроме me (PRP) или ME (PRP)

4. оно по-прежнему соответствует (PRP), даже если слово содержит me . Я хочу, чтобы оно ничему не соответствовало, если слово содержит меня. Вот ссылка: regex101.com/r/hR3mS2

5. большое вам спасибо! и последнее, оно также соответствует пробелу перед совпадением. Я хочу, чтобы оно соответствовало только символам между пробелами, исключая все пробелы, окружающие совпадение

Ответ №2:

Вместо того, чтобы использовать сложные регулярные выражения, которые могли бы сбить с толку практически любого, кто его читает, почему бы вам не разбить свой код на две части, разделив слова на массив и отфильтровав результаты с помощью ненужных вам материалов?

 function prpnotme(w) {
  var r = w.match(/S /g);
  if(r == null)
    return [];
  var i=0;
  while(i<r.length) {
    if(!r[i].contains('PRP') || r[i].toLowerCase().contains('me'))
      r.splice(i,1);
    else
      i  ;
  }
  return r;
}
console.log(prpnotme('whattttttt ok')); // []
console.log(prpnotme('MELOLPRP PRPRP PRPthemeok PRPmhm')); // ['PRPRP', 'PRPmhm']
  

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