2016-03-16 5 views
1

Возможно, это легко, но я не смог найти решение.Регулярное выражение в sas, не соответствующее слову после соответствующего слова

Я работаю в Sas 9.3 с регулярным выражением. Я ищу регулярное выражение, которое соответствует только некоторым словам, за которыми не следует определенное другое слово. Например, он должен соответствовать всему тексту, где у вас есть «автомобиль», а во всем остальном тексте после этого не должно быть «нет». (Дело может быть проигнорировано, потому что я UPCASE все в моем коде)

должны соответствовать

Это не автомобиль я хочу

Автомобиль зеленый

не должны совпадать

Автомобиль не является зеленым

Это автомобиль я хочу, но его нет в наличии

Одно решение было бы разделить его на два матча:

prxmatch("/The car/",mytext) > 0 and prxmatch("/The car.+not/",mytext)=0

Но я должен использовать логику много раз, также в более сложных случаях, поэтому я не хочу всегда использовать 2 prxmatch и вместо этого комбинировать логику в одном prxmatch.

Я много читал о просмотровых aheads и попробовал несколько примеров, но они не работали правильно, например:

"/The Car.+[^(not)]/" 

или

"/The Car.+(?!not)/" 

или

"/^(?!.*not.*).*?The car.*$/" 

первого и второй возвращает все 4 текста в качестве результатов, третье - результат вообще.

Так может ли кто-нибудь предоставить мне решение для этого, просто не оператор для слова или правильный взгляд вперед/за подходом?

+0

Как [ '^ (= * \ B Неправильно автомобиль \ б (я?)?. (?!. * \ BNOT \ б)). * '] (https://regex101.com/r/pT0mP7/1)? Или ['(? I) ^. * \ Bthe car \ b (?!. * \ Bnot \ b). *'] (Https://regex101.com/r/pT0mP7/2) –

+0

@Wiktor Stribiżew: Что делает ли (? im)? Ваш первый пример Возвращает ошибку, ваша вторая, похоже, работает, но только если я добавлю (? Im) при запуске. Итак, благодарю вас, но, возможно, вы можете объяснить мне, как это работает – kl78

+0

У вас есть многострочный ввод строки? Если да, то я понимаю, почему работает '(? M)'. '(? i)' является модификатором без учета регистра, а '(? m)' является многострочным модификатором, создающим '^' совпадение в начале строки, а не начало всей строки. Итак, '' /^.* \ theb \ b (?!. * \ Bnot \ b). */Im "' должен работать. Если да, я отправлю. –

ответ

2

Вы можете использовать

(?im)^.*\bthe car\b(?!.*\bnot\b).* 

пробой regex demo is available here

картины:

  • (?im) - позволяют не чувствительны к регистру и многострочных режимы соответствия
  • ^ - начало строки (с (?m))
  • .* - матч 0+ любые символы, но символ новой строки
  • \bthe car\b - 2 целых слова «автомобиль» (последовательность из 2-х слов)
  • (?!.*\bnot\b) - отрицательный предпросмотр, который не проходит матч, если существует целое слово "не" где-то справа от the car
  • .* - остальные строки до символа новой строки или конца строки
+0

Я попытался максимально упростить ваше решение, «/ CAR (?!. + NOT) /» также работает с конкретным примером, хотя ваше решение намного более безопасно для более сложных конструкций ... – kl78

+0

Если вам не нужен полный линейный матч, конечно, используйте '\ bthe автомобиль \ b (?!. * \ Bnot \ b)' (или нечувствительная к регистру версия '(? I) \ bthe car \ b (?! . * \ BNOT \ б) ') –

Смежные вопросы