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

Я думаю, что самый большой аргумент в пользу языков функционального программирования для становления "следующей большой вещью" то, который в будущих многоядерных процессорах будет нормой. Программисты должны будут использовать в своих интересах это, и функциональное программирование предлагает действительно замечательные возможности для создания вершины строки параллельное программное обеспечение.

P.S., Когда я был в колледже в Бостонском университете ('98-'02) мы потратили Схему изучения семестра, которая является близким родственником LISP. Когда мы сначала начали изучать его, я хотел сорвать волосы. К концу курса это было очень естественно.

116
задан Alan Moore 8 September 2009 в 19:03
поделиться

5 ответов

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

(?!^ABC$)

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

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

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

^((?!ABC).)*$
139
ответ дан 24 November 2019 в 02:17
поделиться

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

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

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

(ABC)|(.)

Захватит все, кроме ABC во 2-й группе. Скобки заключают каждую группу. Итак, (ABC) - это группа 1, а (.) - группа 2.

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

$2

Или в .NET посмотрите на коллекцию Groups внутри класса Regex, чтобы немного больше контроля.

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

ОБНОВЛЕНИЕ: Я нашел гораздо более быстрый способ сделать это здесь: net / tester /? id = 65b32601-2326-4ece-912b-6dcefd883f31

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

(ABC)|(.)

Получит все, кроме ABC во 2-й группе. Скобки заключают каждую группу. Итак, (ABC) - это группа 1, а (.) - группа 2.

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

$2

Или в .NET посмотрите на коллекцию Groups внутри класса Regex, чтобы немного больше контроля.

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

ОБНОВЛЕНИЕ: Я нашел гораздо более быстрый способ сделать это здесь: net / tester /? id = 65b32601-2326-4ece-912b-6dcefd883f31

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

(ABC)|(.)

Получит все, кроме ABC во 2-й группе. Скобки заключают каждую группу. Итак, (ABC) - это группа 1, а (.) - группа 2.

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

$2

Или в .NET посмотрите на коллекцию Groups внутри класса Regex, чтобы немного больше контроля.

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

ОБНОВЛЕНИЕ: Я нашел гораздо более быстрый способ сделать это здесь: http://regexhero.net/tester/?id=997ce4a2-878c-41f2-9d28-34e0c5080e03

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

6
ответ дан 24 November 2019 в 02:17
поделиться

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

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

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

4
ответ дан 24 November 2019 в 02:17
поделиться

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

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

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

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

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

5
ответ дан 24 November 2019 в 02:17
поделиться

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

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

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

  1. меньше трех произвольных символов
  2. ровно три символа, в то время как либо
    • первый не A , или
    • первый - A , но второй не B , или
    • первый A , второй B , но третий не C
  3. более трех произвольных символов
2
ответ дан 24 November 2019 в 02:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: