在perl中的quotemeta?如何解决错误:“正则表达式中的嵌套量词;标记为< - HERE”

时间:2011-12-15 05:40:21

标签: regex perl

以下是代码:

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

从上一个问题:How do I tokenise a word given tokens that are subsumed incompletely in the word?

除了这个错误(我做“使用诊断”)之外没关系:

  

正则表达式中的嵌套量词;标记为< - HERE in           m /(A [aiou~NFKPQRIJ]?l [aiou~NFKPQRIJ]?*< - HERE [aiou~NFKPQRIJ]?y [aiou~N FKPQRIJ]?n [aiou~NFKPQRIJ]?)/ at   tokenizeForCRFinput.pl第47行,第28行8670(#3)       (F)如果没有干预括号,就无法量化量词。所以       **或+ *或?*之类的东西是非法的。 < - HERE在常规中显示       关于发现问题的地方的表达。

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

来自用户代码的未捕获异常:           正则表达式中的嵌套量词;标记为< - HERE in m /(A [aiou~NFKPQRIJ]?l [aiou~FNKPQRIJ]?*< - HERE   [aiou~NFKPQRIJ]?[aiou~NFKPQRIJ]?[aiou~NFKPQRIJ]?)/ at   tokenizeForCRFinput.pl第47行,第288670行   tokenizeForCRFinput.pl第47行

第47行就是这个:

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

我尝试过quotemeta但是没有用 - 也许我用错了? $diac中捕获的某些字符串确实包含'?''*'等特殊字符。

2 个答案:

答案 0 :(得分:3)

该行:

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

如果你确实在@tokens中有元字符,那就是罪魁祸首。试试这个:

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

请注意,您无法引用整个正则表达式,因为您需要$vowels中的元字符。

答案 1 :(得分:1)

该模式最初是

(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...

如果是这样,你需要一个比/./更好的正则表达式解析器。