Regex, который говорит, что не соответствовать? - PullRequest
2 голосов
/ 08 мая 2011

Мне интересно, как сопоставить любые символы , кроме определенной строки (назовите ее "for") в регулярном выражении.

Я думал, может быть, это было что-то вроде этого: [^for]* - за исключением того, что это не работает.

Ответы [ 3 ]

3 голосов
/ 08 мая 2011

Я уверен, что это дуплекс.

Один из способов - запустить ваш паттерн с таким взглядом:

(?=\A(?s:(?!for).)*\z)

Это можно написать так в любой системе регулярного выражениявозиться с:

(?x)            # turn /x mode on for commentary & spacing
(?=             # lookahead assertion; hence nonconsumptive
    \A          # beginning of string
    (?s:        # begin atomic group for later quantification
                        # enable /s mode so dot can cross lines    
        (?! for )       # lookahead negation: ain't no "for" here
        .               # but there is any one single code point
    )           # end of "for"-negated anything-dot
    *           # repeat that group zero or more times, greedily
    \z          # until we reach the very end of the string
)               # end of lookahead

Теперь просто поместите это перед вашим шаблоном и добавьте все остальное, что вы хотели бы после слов.Вот как вы выражаете логику !/for/ && ⋯, когда вам необходимо встроить такие знания в шаблон.

Это похоже на то, как вы строите /foo/ && /bar/ && /glarch/, когда вам нужно поместить его в один шаблон, который является

(?=\A(?s:.)*foo)(?=\A(?s:.)*bar)(?=\A(?s:.)*glarch)
2 голосов
/ 08 мая 2011
^(?!for$).*$

соответствует любой строке, кроме for.

^(?!.*for).*$

соответствует любой строке, которая не содержит for.

^(?!.*\bfor\b).*$

соответствует любой строке, которая не содержит for как полное слово, но допускает такие слова, как forceps.

0 голосов
/ 08 мая 2011

Вы можете попытаться проверить, соответствует ли строка for, и отменить результат на любом языке, который вы используете (например, if (not $_ =~ m/for/) в Perl)

...