正则表达式和分组

吉拉

我有一个正则表达式来匹配形式为x = y的字符串。即为名称分配了一个值。该值可以选择用引号引起来,并且名称和值都符合\ w +

我的正则表达式是

\w+=\w+|"\w+"|'\w+'

一条线上可以有多个这样的分配,但是在这里我遇到了问题。由于某种原因,当我将此正则表达式包含在(?:)中时,它将不匹配。请参阅下面的测试用例

use Test::More;

my $re1 = qr/^\w+=\w+|"\w+"|'\w+'$/p;
my $re2 = qr/^(?:\w+=\w+|"\w+"|'\w+')$/p;

ok('xy="abc"' =~ $re1);

say "PREMATCH ${^PREMATCH}";
say "MATCH ${^MATCH}";
say "POSTMATCH ${^POSTMATCH}";


ok('xy="abc"' =~ $re2);

done_testing;

输出为

ok 1
PREMATCH xy=
MATCH "abc"
POSTMATCH
not ok 2
#   Failed test at ./test.pl line 20.
1..2
# Looks like you failed 1 test of 2.

我不明白为什么第一个不匹配。而且我也不明白为什么第一个只匹配等号后的部分。

在线警察

你的

^\w+=\w+|"\w+"|'\w+'$

相当于

(?:^\w+=\w+)|(?:"\w+")|(?:'\w+'$)

它与^单词前后的空格或引号匹配,或者与出现在字符串末尾的单词周围的单引号匹配。

你的

^(?:\w+=\w+|"\w+"|'\w+')$

要求该组中的所有组均从该行的开头(由于^该组外部)开始,然后进行各种测试,然后所有这些组中的所有组必须在​​该字符串的末尾(由于该组的$外部)完成群组)。

最简单的解决方法是将^都移动$到组中:

(?:^\w+=\w+|"\w+"|'\w+'$)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章