如何判断Perl正则表达式模式中哪些替代项匹配?

div*_*ero 3 regex perl capture regex-group

我有一个正则表达式列表(大约10 - 15),我需要匹配一些文本.在循环中逐个匹配它们太慢了.但是我没有编写自己的状态机来同时匹配所有正则表达式,而是尝试|单独的正则表达式并让perl完成工作.问题是我怎么知道哪些替代品匹配?

这个问题解决了每个正则表达式中没有捕获组的情况.(哪个部分与正则表达式相匹配?)如果每个正则表达式中都有捕获组怎么办?

所以有以下几点,

/^(A(\d+))|(B(\d+))|(C(\d+))$/
Run Code Online (Sandbox Code Playgroud)

和字符串"A123",我怎么能知道A123匹配并提取"123"?

Sin*_*nür 5

为什么不用/^ (?<prefix> A|B|C) (?<digits> \d+) $/x.注意,命名捕获组用于清晰,而不是必需的.


Oes*_*sor 5

您不需要编写自己的状态机来组合正则表达式.看看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
Run Code Online (Sandbox Code Playgroud)