将regexp与Perl中的边界值匹配

时间:2014-11-03 10:12:45

标签: regex perl

我正在尝试将下面提到的正则表达式与\b\W进行匹配。它与\b不匹配,但与\W

匹配
my $response = "ABC-12-1-1::HELLO=TX,PROVFEADDR=\"\",ValueFORM=NAME-CITY-STREET-PRT,";

print "\n\n\n$response\n\n\n";
if ( $response =~ /PROVFEADDR=\b/ )    ##### matching with //PROVFEADDR=\W/
{
    print "matched\n";
} else {
    print "not matched\n";
}

任何线索

根据用户评论我正在编辑一点点。

我现在明白为什么它与\W匹配。以下是我开始使用\b

的问题

PROVFEADDR是要匹配的变量。在这种特殊情况下,我必须匹配PROVFEADR=。之前我们使用\W+代替\b。使用\W+时,问题是我们必须在字符串末尾匹配。 \W+预计至少有一个\W,如果它位于字符串的最后,则不存在\b。所以我替换为在上述场景中工作的{{1}}。有什么建议可以处理这两种情况吗?

2 个答案:

答案 0 :(得分:3)

\b不匹配的原因是它旁边需要一个单词和一个非单词字符,并且你有两个非单词字符。

在您的评论中,您提到您正在寻找也匹配行尾的\W的替代品,在这种情况下可以使用负前瞻断言:

if($response =~ /PROVFEADDR=(?!\w)/)

断言下一个字符不是字母数字字符。这也将匹配行尾(空字符串)。

答案 1 :(得分:1)

$response中,PROVFEADDR=之后的字符是双引号,而不是单词,因此它与\W(非单词)匹配。

它与\b不匹配,因为它不是单词边界。将其与:

进行比较
if($response =~ /PROVFEADDR\b=/)

此处,R=之间是单词边界。