Отрицание чередования в регулярных выражениях - PullRequest
4 голосов
/ 19 октября 2010

Я могу использовать «Чередование» в регулярном выражении, чтобы соответствовать любому вхождению «кошка» или «собака», таким образом:

(cat|dog)

Можно ли ОТКАЗАТЬ это чередование и сопоставить все, что НЕ "кошка" или "собака"?

Если да, то как?

Например:

Допустим, я пытаюсь сопоставить END OF SENTENCE на английском языке, приблизительно.

В уме:

(\.)(\s+[A-Z][^.]|\s*?$)

Со следующим абзацем:

Быстрая коричневая лиса перепрыгивает через ленивую собаку. Однажды доктор Санчес, мистер Парсонс и губернатор Мейсон пошли в магазин. Привет, мир.

Я неправильно нахожу «конец предложения» у доктора, мистера и губернатора.

(я тестирую, используя http://regexpal.com/ на тот случай, если вы хотите увидеть то, что я вижу в приведенном выше примере)

Поскольку это неверно, я хотел бы сказать что-то вроде:

!(Dr\.|Mr\.|Gov\.)(\.)(\s+[A-Z][^.]|\s*?$)

Конечно, это не работает, поэтому я обращаюсь за помощью.

Я тоже пытался! / (Доктор | Мистер | Правитель.) /, И! ~ Которые ничем не помогали.

Как я могу избежать совпадений для "Доктор", "Мистер" и "губернатор" и т.д?

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 19 октября 2010

Это невозможно.Обычно вы делаете это, используя отрицательный lookbehind (?<!…), но регулярное выражение JavaScript не поддерживает это.Вместо этого вам придется фильтровать совпадения по факту, чтобы отбросить те, которые вам не нужны.

0 голосов
/ 20 октября 2010

(?! NotThisStuff) - это то, что вы хотите, иначе известная как группа с негативным прогнозом.

К сожалению, это не сработает так, как вы собираетесь. / (?! Dr \.) (\.) / по-прежнему будет возвращать периоды, принадлежащие «доктору Санчесу» из-за второй группировки. Парсер Regex скажет себе: «Да, это». не 'Доктор' ' / ((?! Доктор).) / тоже не сработает, хотя я считаю, что должно.

И более того, вы все равно будете просматривать все предложения "заканчивается". Actionscript не имеет "match all", только сначала совпадение. Вы должны установить глобальный флаг (или добавить g в конец вашего регулярного выражения) и вызывать exec, пока ваш объект результата не станет нулевым.

var string = 'The quick brown fox jumps over the lazy dog. Once upon a time Dr. Sanches, Mr. Parsons and Gov. Mason went to the store. Hello World.';

var regx:RegExp = /(?!Dr\.)(\.)/g;
var result:Object = regx.exec(string);

for (var i = 0; i < 10; i++) { // paranoia
  if (result == null || result.index == 0) break; // again: paranoia
  trace(result.index, result);
  result = regx.exec(string);
}

// trace results:    
//43 .,.
//64 .,.
//77 .,.
//94 .,.
//119 .,.
//132 .,.
0 голосов
/ 19 октября 2010

Вы можете сделать это:

!/(cat|dog)/

РЕДАКТИРОВАТЬ: Вы должны были включить язык программирования в свой вопрос. Его Actionscript верно? Я не кодер ActionScript, но AFAIK это сделано так:

var pattern2:RegExp = !/(cat|dog)/;
0 голосов
/ 19 октября 2010

В таких языках, как Perl / awk, есть оператор !~

$string !~ /(cat|dog)/

В Actionscript вы можете просто использовать оператор NOT !, чтобы отменить совпадение. См. здесь для справки. Также здесь для сравнения вкусов regex

...