如何巧妙地将"x"和"[x]"与正则表达式匹配而不重复?

Tim*_*Tim 7 regex perl readability

我正在写一个Perl正则表达式来匹配字符串x bla[x] bla.一种选择是/(?:x|\[x\]) bla/.这是不可取的,因为在现实世界中,x更复杂,所以我想避免重复它.

到目前为止,最好的解决方案是x输入变量并预编译正则表达式:

my $x = 'x';
my $re = qr/(?:$x|\[$x\]) bla/o;
Run Code Online (Sandbox Code Playgroud)

有更整洁的解决方案吗?在这种情况下,可读性比性能更重要.

jay*_*tea 9

这是可能的,但不是全部清洁.您可以使用条件子模式支持测试的事实,例如(?(N))检查第N个捕获子模式是否成功匹配.所以你可以使用一个表达式/(\[)?X(?(1)\])/来匹配'[X]'或'X'.

  • 还有一个技巧可以用于不支持条件子模式的简单正则表达式:`/(\ [())?X(\ 2 \])?/`.这样,如果存在开括号,则将空字符串匹配为\ 2,您可以稍后检查. (2认同)