【发布时间】:2018-12-16 05:22:55
【问题描述】:
Perl6 正则表达式匹配连接 && 如果连接中的所有部分匹配相同的子字符串而不是整个字符串,则返回 True:
> my $a="123abc456def";
123abc456def
> so $a ~~ m/ 23 && ef /
False
这是 False 因为连词中的“23”匹配了 $a 中的“23”子串,但是这个子串不匹配连词中的“ef”。这有点违反直觉,因为将 $a~~m/23&&ef/ 解释为“$a 匹配 23 并且 $a 匹配 ef”比解释为“$a 有一个匹配 23 的子字符串并且这个子字符串也匹配 ef”更容易”。
如果我有 n 个正则表达式,并且我想查看所有这些 n 个正则表达式是否匹配相同的整个字符串,而不是匹配整个字符串的相同子字符串部分,那么编写 perl6 表达式的最佳方法是什么?
在示例中,我是真的打算这样做
so (($a ~~ /23/) && ($a ~~ /ef/))
如果正则表达式的数量很大,那么除了循环之外,上面的代码更难编写:
so (gather {for @myRegexes { take $a ~~ / $_ /; } }).all
有没有更简单的方法?
通过交替,更容易理解为“$a 匹配 23 或 $a 匹配 ef”而不是“$a 匹配 23 或匹配 ef 的部分”:
> so $a ~~ m/ 23 || ef /
True
谢谢!
lisprog
【问题讨论】:
-
"这有点反直觉......" 也许但是文档在这里做得合理甚至很好:"如果所有
&&-delimited 段匹配目标的相同子字符串,则匹配成功细绳。” docs.perl6.org/language/regexes#Conjunction:_&&