RegEx для исключения конкретной строковой константы
Можно ли использовать регулярное выражение для соответствия любой строке, кроме определенной строковой константы, скажем, «ABC»? Можно ли исключить только одну конкретную строковую константу? Спасибо за помощь заранее.
- Что такое группа, не связанная с захватом? Что делает (? :)?
- Регулярное выражение для запрещения более 1 штриха последовательно
- Поиск UUID в тексте с регулярным выражением
- Что значит ?! имею в виду?
- Регулярное выражение
- Regex - Должны ли экраны сбрасываться?
- Что такое регулярное выражение для MAC-адреса?
- Поддержка \ K в regex
Вы должны использовать отрицательное утверждение.
(?!^ABC$)
Например, вы можете использовать следующее.
(?!^ABC$)(^.*$)
Если это не работает в вашем редакторе, попробуйте это. Он проверен на работу в ruby и javascript:
^((?!ABC).)*$
Это непросто, если у вашего механизма regexp нет особой поддержки. Самый простой способ – использовать параметр отрицательного соответствия, например:
$var !~ /^foo$/ or die "too much foo";
Если нет, вы должны сделать что-то злое:
$var =~ /^(($)|([^f].*)|(f[^o].*)|(fo[^o].*)|(foo.+))$/ or die "too much foo";
Это в основном говорит «если он начинается с не- f
, остальное может быть любым: если оно начинается с f
, non o
, то остальное может быть любым, иначе, если оно начнется fo
, следующий символ лучше не будет другим o
“.
В .NET вы можете использовать группировку в своих интересах следующим образом:
http://regexhero.net/tester/?id=65b32601-2326-4ece-912b-6dcefd883f31
Вы заметите, что:
(ABC)|(.)
Захватит все, кроме ABC во 2-й группе. Круглые скобки окружают каждую группу. Таким образом, (ABC) является группой 1 и (.) Является группой 2.
Поэтому вы просто возьмете вторую группу, как это, взамен:
$2
Или в .NET посмотрите на коллекцию групп внутри classа Regex для получения большего контроля.
Вы также должны сделать что-то подобное в большинстве других реализаций регулярных выражений.
ОБНОВЛЕНИЕ: я нашел гораздо более быстрый способ сделать это здесь: http://regexhero.net/tester/?id=997ce4a2-878c-41f2-9d28-34e0c5080e03
Он по-прежнему использует группировку (я не могу найти способ, который не использует группировку). Но этот метод более чем в 10 раз быстрее, чем первый.
Вы можете использовать негативный просмотр или что-то вроде этого:
^([^A]|A([^B]|B([^C]|$)|$)|$).*$
Может быть, это может быть немного упрощено.
Попробуйте это регулярное выражение:
^(.{0,2}|([^A]..|A[^B].|AB[^C])|.{4,})$
Он описывает три случая:
- менее трех произвольных символов
- ровно три символа, в то время как
- первый не является
A
, или - первый –
A
а второй – неB
, или - первый – это
A
, второйB
а третий – неC
- первый не является
- более трех произвольных символов