我有一个正则表达式来匹配形式为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] 删除。
我来说两句