2013-05-11 5 views
3

Я пытаюсь написать регулярное выражение, которое найдет любое слово, за которым следует пробел, если это слово не AND, OR, NOT.Negative lookahead regex игнорировать список слов

Я попытался отрицательный предпросмотр после поиска подобных проблем, это мое текущее регулярное выражение: (?!AND|OR|NOT).*?\\s

Если бы я попробовать это с «И» я получаю матч на «ND». Если я попытаюсь с помощью «ИЛИ», я получаю «R», и если я попытаюсь с «НЕ», я получу «ОТ».

Может ли кто-нибудь помочь?

+0

попробовать это - ' (?! (AND | OR | NOT)). * \ S' – Bill

+0

Пробовал это, и он по-прежнему возвращает матч после первого персонажа. – GPW

+2

Можем ли мы увидеть строку, с которой вы пытаетесь сопоставить? Что это за язык? –

ответ

4

Попробуйте с этим рисунком:

\\b(?!(?:AND|OR|NOT)\\b)[a-zA-Z]+\\s 

Я добавил некоторые границы слова (\ б) и используется класс символов [a-zA-Z] (вы можете заменить его на [AZ] в случае нечувствительной контексте), чтобы избежать ленивый квантификатор.

или более производительный (с чувствительно к регистру):

\\b(?>(?>[b-mp-z])|(?!(?>and|or|not)\\b)[aon])(?>[a-z]*)\\s 

, если вы хотите, чтобы соответствовать:

  • слова между двойными кавычками без двойных кавычек и пробелов:

(?<=(\"?)\\b)(?!(?:AND|OR|NOT)\\b)[a-zA-Z]+(?=\\1(?:\\s|$))

  • слово между двойными кавычками с двойными кавычками:

(\"?)(?<=\\b)(?!(?:AND|OR|NOT)\\b)[a-zA-Z]+\\1(?=\\s|$)

  • слово между скобкой без скобок:

(?<=(\\()\\b)(?!(?:AND|OR|NOT)\\b)[a-zA-Z]+(?=(?(1)\\)|(?:\\s|$)))

  • слово между скобкой и дважды котировки без обоих:

(?<=(\\()?(\"?)\\b)(?!(?:AND|OR|NOT)\\b)[a-zA-Z]+(?=(?(1)\\)|\\2(?:\\s|$)))

  • слова, которые не являются И ИЛИ НЕ без всего, что вы хотите:

\\b(?!(?:AND|OR|NOT)\\b)[a-zA-Z]+\\b

+0

Это похоже на работу, но мне нужно, чтобы соответствовать на "и (также так, например Название:„Специальный“Один и„XYZ“ Я изменил запрос: \\ b (?! (?: AND | OR | NOT) \\ b) [a-zA-Z \\\ "] + \\ s (добавлено в конец \\\" в конце) Но это только улавливает последнее «в словах, например, Специальные« и XYZ ». Любые предложения? – GPW

+0

@ user2367873: вы хотите поймать слова между двойными кавычками, но вы хотите поймать их двойными кавычками или без ? –

+0

Я думаю, что у меня есть Теперь я добавил «?» (? чтобы поймать любые кавычки или скобки в начале и изменить конечную часть, чтобы поймать что-либо. В основном я пытаюсь разобрать большой запрос с различными возможностями. У меня есть 2 regexs, которые ловят первые два варианта, и этот должен был получить что-нибудь, что не было одним из них. Мой запрос сейчас: \ "? (? \ B (?! (?: AND | OR | NOT) \ b). +? \\ s Я думаю, что это поймает 0-1" или (в начале то граница не должна давать AND | OR | NOT, а затем не разглашать ничего до пробела. Правильно ли это звучит? – GPW

3

Хм, я не уверен на 100%, если я правильно понял , но не могли бы вы попробовать это и посмотреть, это то, что вы искали?

(?<=\bAND|\bOR|\bNOT)\s.* 

Это будет соответствовать XYZ в своем комментарии (хотя с предыдущим белым характером). Я проверил его here после добавления слова между ними.

EDIT: Если нет больше символов справа и вам нужны последние три символа, вы можете использовать:

\w+$ 

или:

[^\s]+$ 
+0

+1 для обмена http://www.regex101.com/ – Bill

+0

Так что это будет только матч на словах, которые следуют И ИЛИ НЕ? Правильно ли это, это положительный взгляд? Это работает. Я думаю, что в этом случае (где одно из них - это первое), но нет, если нет. Мне нужно, чтобы оно соответствовало любому слову, которое не является таким, чтобы оно могло быть примерно таким: Имя: Тест IBM У меня есть другое выражение, которое получает Name: Test. Мне нужен этот, чтобы получить IBM здесь. У меня есть несколько выражений, каждый из которых получает отдельные случаи, этот должен поймать все, что осталось, но не эти 3 ключевых слова. – GPW

+0

Подожди, я просто кое-что понял ... Есть ли больше символов справа? Если нет, вы можете использовать простой '[^ \ s] + $' или '\ w + $'. – Jerry