Ошибка в вашем прогнозном утверждении об отрицании состоит в том, что вы не собрали все вместе в соответствии с общим случаем.Вы должны сделать так, чтобы его утверждение применялось к каждой позиции персонажа, когда вы ползете вперед.Это относится только к одной возможной точке так, как вы ее написали, в то время как она нужна для применения ко всем из них.Ниже описано, как вы должны сделать это, чтобы сделать это правильно.
Вот рабочая демонстрация, которая показывает два разных подхода:
Первый использует отрицательный прогноз, чтобы гарантироватьчто левая часть не содержит только для чтения , а правая часть не начинается со знака числа.
Вторая выполняет более простой синтаксический анализатор, а затем отдельно проверяетлевая и правая части для отдельных ограничений, применимых к каждому из них.
Демонстрационный язык - Perl, но одни и те же шаблоны и логика должны работать практически везде.
#!/usr/bin/perl
while (<DATA>) {
chomp;
#
# First demo: use a complicated regex to get desired part only
#
my($label) = m{
^ # start at the beginning
(?: # noncapture group:
(?! \b readonly \b ) # no "readonly" here
. # now advance one character
) + # repeated 1 or more times
\s* = \s* # skip an equals sign w/optional spaces
" ( [^#"] [^"]* ) " # capture #1: quote-delimited text
# BUT whose first char isn't a "#"
}x;
if (defined $label) {
print "Demo One: found label <$label> at line $.\n";
}
#
# Second demo: This time use simpler patterns, several
#
my($lhs, $rhs) = m{
^ # from the start of line
( [^=]+ ) # capture #1: 1 or more non-equals chars
\s* = \s* # skip an equals sign w/optional spaces
" ( [^"]+ ) " # capture #2: all quote-delimited text
}x;
unless ($lhs =~ /\b readonly \b/x || $rhs =~ /^#/) {
print "Demo Two: found label <$rhs> at line $.\n";
}
}
__END__
protected static readonly string BACKGROUND_MUSIC_NAME = "Music_Mission_Complete_Loop_audio";
mainWindow.Id = "MainWindow";
mainStoLabel.Text = "#stb_entry_clah";
У меня есть два совета.Во-первых, убедитесь, что вы ВСЕГДА используете режим /x
, чтобы вы могли создавать документированные и поддерживаемые регулярные выражения.Во-вторых, гораздо чище делать что-то по очереди, как во втором решении, а не все сразу, как в первом.