我有一个正则表达式列表(大约10 – 15),我需要匹配一些文本.在循环中逐个匹配它们太慢了.但是,我没有编写自己的状态机来同时匹配所有正则表达式,而是尝试|个人正则表达式让perl完成工作.问题是我怎么知道哪些替代品匹配?
这个问题解决了每个正则表达式中没有捕获组的情况. (which portion is matched by regex?)如果每个正则表达式中都有捕获组怎么办?
所以有以下几点,
/^(A(\d+))|(B(\d+))|(C(\d+))$/
和字符串“A123”,我怎么能知道A123匹配并提取“123”?
解决方法
您不需要编写自己的状态机来组合正则表达式.查看
Regexp:Assemble.它有一些方法可以跟踪哪些初始模式匹配.
编辑:
use strict; use warnings; use 5.012; use Regexp::Assemble; my $string = 'A123'; my $re = Regexp::Assemble->new(track => 1); for my $pattern (qw/ A(\d+) B(\d+) C(\d+) /) { $re->add($pattern); } say $re->re; ### (?-xism:(?:A(\d+)(?{0})|B(\d+)(?{2})|C(\d+)(?{1}))) say for $re->match($string); ### A(\d+) say for $re->capture; ### 123