RegEx для исключения определенной строковой константы

Можно ли использовать регулярное выражение для соответствия любой строке, кроме определенной строковой константы, скажем, "ABC"? Можно ли исключить только одну конкретную строковую константу? Спасибо за помощь заранее.

Ответ 1

Вы должны использовать отрицательное утверждение.

(?!^ABC$)

Можно использовать, например, следующее.

(?!^ABC$)(^.*$)

Если это не работает в вашем редакторе, попробуйте это. Он проверен на работу в ruby ​​и javascript:

^((?!ABC).)*$

Ответ 2

Это непросто, если у вашего механизма regexp нет особой поддержки. Самый простой способ - использовать параметр отрицательного соответствия, например:

$var !~ /^foo$/
    or die "too much foo";

Если нет, вам нужно сделать что-то зло:

$var =~ /^(($)|([^f].*)|(f[^o].*)|(fo[^o].*)|(foo.+))$/
    or die "too much foo";

В основном говорится: "если он начинается с не f, остальное может быть любым: если он начинается с f, не o, остальное может быть любым, в противном случае, если он запустится fo, следующий символ лучше не быть другим o".

Ответ 3

Вы можете использовать отрицательный lookahead или что-то вроде этого:

^([^A]|A([^B]|B([^C]|$)|$)|$).*$

Возможно, это может быть немного упрощено.

Ответ 4

В .NET вы можете использовать группировку в своих интересах следующим образом:

http://regexhero.net/tester/?id=65b32601-2326-4ece-912b-6dcefd883f31

Вы заметите, что:

(ABC)|(.)

Будет захватывать все, кроме ABC во 2-й группе. Круглые скобки окружают каждую группу. Итак, (ABC) является группой 1 и (.) Является группой 2.

Итак, вы просто возьмете вторую группу, как это, взамен:

$2

Или в .NET посмотрите на коллекцию групп внутри класса Regex для более легкого контроля.

Вы также можете сделать что-то подобное в большинстве других реализаций регулярных выражений.

UPDATE: я нашел гораздо более быстрый способ сделать это здесь: http://regexhero.net/tester/?id=997ce4a2-878c-41f2-9d28-34e0c5080e03

Он по-прежнему использует группировку (я не могу найти способ, который не использует группировку). Но этот метод более чем в 10 раз быстрее, чем первый.

Ответ 5

Попробуйте это регулярное выражение:

^(.{0,2}|([^A]..|A[^B].|AB[^C])|.{4,})$

Он описывает три случая:

  • меньше трех произвольных символов
  • ровно три символа, в то время как
    • первым не является A, или
    • первая A, а вторая не B, или
    • первая A, вторая B, но третья не C
  • более трех произвольных символов