以下是代码:
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
中捕获的某些字符串确实包含'?'
和'*'
等特殊字符。
答案 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...
如果是这样,你需要一个比/./
更好的正则表达式解析器。