Я думаю, что самый большой аргумент в пользу языков функционального программирования для становления "следующей большой вещью" то, который в будущих многоядерных процессорах будет нормой. Программисты должны будут использовать в своих интересах это, и функциональное программирование предлагает действительно замечательные возможности для создания вершины строки параллельное программное обеспечение.
P.S., Когда я был в колледже в Бостонском университете ('98-'02) мы потратили Схему изучения семестра, которая является близким родственником LISP. Когда мы сначала начали изучать его, я хотел сорвать волосы. К концу курса это было очень естественно.
Вы должны использовать утверждение отрицательного просмотра вперед.
(?!^ABC$)
Вы можете, например, использовать следующее.
(?!^ABC$)(^.*$)
Если это не работает в вашем редакторе, попробуйте следующее. Он протестирован для работы в ruby и javascript:
^((?!ABC).)*$
В .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 раз быстрее первого.
Вы можете использовать отрицательный просмотр вперед или что-то вроде этого:
^([^A]|A([^B]|B([^C]|$)|$)|$).*$
Возможно, это можно было бы немного упростить.
Это непросто, если ваш механизм регулярных выражений не имеет специальной поддержки для этого. Самый простой способ - использовать опцию отрицательного совпадения, например:
$var !~ /^foo$/
or die "too much foo";
Если нет, вы должны сделать что-то злое:
$var =~ /^(($)|([^f].*)|(f[^o].*)|(fo[^o].*)|(foo.+))$/
or die "too much foo";
Этот в основном говорит: «если оно начинается с не- f
, остальное может быть любым; если оно начинается с f
, не- o
, остальное может быть любым; в противном случае, если оно начинается с fo
, следующее персонажу лучше не быть другим o
".
Попробуйте это регулярное выражение:
^(.{0,2}|([^A]..|A[^B].|AB[^C])|.{4,})$
Оно описывает три случая:
A
, или A
, но второй не B
, или A
, второй B
, но третий не C