Цитата в Perl? Как устранить ошибку: «Вложенные квантификаторы в регулярном выражении; отмечены знаком <- ЗДЕСЬ» - PullRequest
2 голосов
/ 15 декабря 2011

Ниже приведен код:

my $vowels = "[aiou~NFKPQRIJ]";
my @diactok;
for $rx (@tokens) {
    $rx =~ s/.\K/$vowels?/g;
    if ($diac =~ /($rx)/) {
        push @diactok, $diac =~ /$rx/g;
    }
}

Из этого предыдущего вопроса: Как я могу токенизировать слово с указанными токенами, которые не полностью включены в слово?

Это нормально, за исключением этой ошибки (я "использовал диагностику"):

Вложенные квантификаторы в регулярном выражении;отмечено <- ЗДЕСЬ в м / (A [aiou ~ NFKPQRIJ]? l [aiou ~ NFKPQRIJ]? * <- ЗДЕСЬ [aiou ~ NFKPQRIJ]? y [aiou ~ N FKPQRIJ]? n [aiou ~ NFKPQRIJ]?) / at tokenizeForCRFinput.pl Строка 47, строка 28 8670 (# 3) (F) Вы не можете дать количественную оценку количеству без вставляемых скобок.Так что такие вещи, как ** или + * или? * Являются незаконными.Символ <- HERE показывает в регулярном выражении, где обнаружена проблема. </p>

Note that the minimal matching quantifiers, *?, +?, and
?? appear to be nested quantifiers, but aren't.  See perlre.

Неисследованное исключение из кода пользователя: вложенные квантификаторы в регулярном выражении;отмечено <- ЗДЕСЬ в м / (A [aiou ~ NFKPQRIJ]? l [aiou ~ NFKPQRIJ]? * <- ЗДЕСЬ [aiou ~ NFKPQRIJ]? y [aiou ~ NFKPQRIJ]? n [aiou ~ NFKPQRIJ]?))/ в tokenizeForCRFinput.pl, строка 47, строка 288670. в tokenizeForCRFinput.pl, строка 47 </p>

Строка 47 выглядит следующим образом:

if ($diac =~ /($rx)/)

Я пробовал quotemeta, но это не сработало- может я неправильно это использую?Некоторые из строк, захваченных в $diac, действительно имеют специальные символы, такие как '?' и '*'.

Ответы [ 2 ]

3 голосов
/ 15 декабря 2011

Линия:

$rx =~ s/.\K/$vowels?/g;

Является виновником, если у вас действительно есть метасимволы в @tokens. Попробуйте это:

$rx =~ s/(.)/ quotemeta($1) . "$vowels?" /eg;

Обратите внимание, что вы не можете заключить в кавычки все регулярное выражение, так как у вас есть метасимволы в $vowels, которые необходимы.

1 голос
/ 15 декабря 2011

Первоначально шаблон

(Al*yn)

Вы меняете его на

(A[aiou~NFKPQRIJ]?l[aiou~NFKPQRIJ]?*[aiou~NFKP...

Как говорится в nessage, [aiou~NFKPQRIJ]?* неверно.Вы не указали, что хотите, поэтому трудно дать вам исправление.

Может быть, вы хотите

(A(?:[aiou~NFKPQRIJ]?)l(?:[aiou~NFKPQRIJ]?)*(?:[aiou~NFKP...

Если это так, просто используйте

$rx =~ s/.\K/(?:$vowels?)/g;

Может быть, вы хотите

(A(?:[aiou~NFKPQRIJ]?)(?:l[aiou~NFKPQRIJ]?)*(?:[aiou~NFKP...

Если это так, вам понадобится намного лучший анализатор регулярных выражений, чем /./.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...