Можно ли использовать регулярное выражение для соответствия любой строке, кроме определенной строковой константы, скажем, "ABC"? Можно ли исключить только одну конкретную строковую константу? Спасибо за помощь заранее.
RegEx для исключения определенной строковой константы
Ответ 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
- первым не является
- более трех произвольных символов