Обновление: В комментарии к вашему вопросу вы упомянули, что хотите очистить вики-разметку и удалить сбалансированные последовательности {{
... }}
. Раздел 6 FAQ по Perl охватывает это: Можно ли использовать регулярные выражения Perl для сопоставления сбалансированного текста?
Рассмотрим следующую программу:
#! /usr/bin/perl
use warnings;
use strict;
use Text::Balanced qw/ extract_tagged /;
# for demo only
*ARGV = *DATA;
while (<>) {
if (s/^(.+?)(?=\{\{)//) {
print $1;
my(undef,$after) = extract_tagged $_, "{{" => "}}";
if (defined $after) {
$_ = $after;
redo;
}
}
print;
}
__DATA__
Lorem ipsum dolor sit amet, consectetur
adipiscing elit. {{delete me}} Sed quis
nulla ut dolor {{me too}} fringilla
mollis {{ quis {{ ac }} erat.
Выход:
Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Sed quis
nulla ut dolor fringilla
mollis {{ quis erat.
Для вашего конкретного примера вы можете использовать
$text =~ s/[^ac]|a(?!c)|(?<!a)c//g;
То есть, удаляйте a
или c
только тогда, когда они не являются частью последовательности ac
.
В общем, это сложно сделать с регулярным выражением.
Скажем, вы не хотите, чтобы foo
следовал необязательный пробел, а затем bar
в $str
. Часто это проще и проще проверить отдельно. Например:
die "invalid string ($str)"
if $str =~ /^.*foo\s*bar/;
Вас также может заинтересовать ответ на аналогичный вопрос , где я написал
my $nofoo = qr/
( [^f] |
f (?! o) |
fo (?! o \s* bar)
)*
/x;
my $pattern = qr/^ $nofoo bar /x;
Чтобы понять сложность, прочитайте Как работают регулярные выражения Марка Домина. Движок компилирует регулярные выражения в конечные автоматы. Когда приходит время сопоставления, он передает входную строку конечному автомату и проверяет, завершает ли конечный автомат состояние принятия. Поэтому, чтобы исключить строку, вы должны указать компьютер, который принимает все входные данные, кроме определенной последовательности.
Что может помочь, это переключатель регулярных выражений /v
, который создает конечный автомат как обычно, но затем дополняет бит подтверждения состояния для всех состояний. Трудно сказать, действительно ли это будет полезно по сравнению с отдельными проверками, потому что регулярное выражение /v
может по-прежнему удивлять людей, просто по-разному.
Если вас интересуют теоретические детали, см. Введение в формальные языки и автоматы , автор Peter Linz.