У меня очень сумасшедшее регулярное выражение, которое я пытаюсь диагностировать. Это также очень долго, но я сократил его до следующего сценария. Запустите с помощью Strawberry Perl v5.26.2.
use strict;
use warnings;
my $text = "M Y H A P P Y T E X T";
my $regex = '(?i)(?<!(Mon|Fri|Sun)day |August )abcd(?-i)';
if ($text =~ m/$regex/){
print "true\n";
}
else {
print "false\n";
}
Это дает ошибку "Переменная длина lookbehind не реализована в regex".
Я надеюсь, вы можете помочь с несколькими вопросами:
- Я не понимаю, почему эта ошибка возникла, потому что все возможные значения lookbehind имеют 7 символов: "понедельник", "пятница", "воскресенье", "август".
- Я сам не писал это регулярное выражение, и я не уверен, как интерпретировать синтаксис
(?i)
и(?-i)
. Когда я избавляюсь от(?i)
ошибка действительно уходит. Как perl интерпретировать эту часть регулярного выражения? Я бы подумал, что первые два символа оцениваются как "необязательные литеральные круглые скобки", за исключением того, что скобки не экранированы, и в этом случае я получаю другую синтаксическую ошибку, потому что закрывающие круглые скобки не будут сопоставляться. - Такое поведение начинается где-то между Perl 5.16.3_64 и 5.26.1_64, по крайней мере, в Strawberry Perl. Первая версия в порядке с кодом, а вторая - нет. Почему это началось?