После игры вокруг с этим в Perl, я придумал это.
Я тестировал все ответы, размещенные на Perl. Проблемы возникают из-за попытки сопоставления
очень большие строки. В основном из них> 256 К. Перл, похоже, не находит ни одного матча, где на
меньший размер. Возможно, это настройка, которую я не использую, я не знаю ..
Исключением было рекурсивное регулярное выражение Казимира, которое занимает минуту, чтобы соответствовать 3-мегабуферу.
Итак, для усмешек я собрал регулярное выражение, соответствующее отрицанию того, что разрешено.
Буфер на 15 мегабайт занимает максимум 10 секунд на моей машине в зависимости от того, где ошибка (совпадение)
была или 10 секунд, если она пройдет.Примечательно, что нет накопления
информация о захвате, возможно, поэтому она может обрабатывать большие буферы.
$test = "ex,xy,gt,55,66,";
for (0 .. 19) { $test .= $test; }
$test .= "3a3";
print "\nlength = ", length($test), "\n------------\n";
if ($test =~ m/
# \d(?:[a-z]|\d{2})|[a-z](?:\d|[a-z]{2})|[^a-z\d,]|,(?:.?,|$)|^,
\d
(?: [a-z] | \d{2})
|
[a-z]
(?: \d | [a-z]{2})
|
[^a-z\d,]
|
,
(?: .? , | $)
|
^,
/xg)
{ print "Found error at pos = ", pos($test), "\n"; }
else
{ print "Passed test!\n"; }
__END__
Output >>
length = 15728643
------------
Found error at pos = 15728642
Соответствие действительности: '2f'? –
'\ w' уже содержит числа '\ d', что означает, что вы также можете получать смешанные совпадения букв и цифр, например, один Тим, упомянутый выше' 2f'. Вам нужно решить, является ли это действительным совпадением. Кроме того, '[\ d \ d]' является избыточным выражением, которое упрощается до '\ d'. – TLP
Нет его недействительного соответствия только тем, что я имею в виду, я пересмотрел quesition – smith