【问题标题】:Matching regexp with boundary values in Perl将正则表达式与 Perl 中的边界值匹配
【发布时间】:2014-11-03 10:12:44
【问题描述】:

我正在尝试将下面提到的正则表达式与\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";
}

任何线索

根据用户 cmets,我正在编辑一些帖子。

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

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

【问题讨论】:

  • 你的意思是它不匹配\b,而是匹配\W,对吧?
  • @YuHao:是的,它与\b不匹配
  • 假设余浩是正确的,你的意思是相反的:\b 是单词边界:它的左右字符必须是一个单词字符,一个非单词字符。 =" 都是非单词,因此 \b 无法匹配。
  • 我不明白为什么您必须在 PROVFEADDR= 之后匹配 anything (尽管您几乎可以肯定需要匹配词边界 before如果它是一个标识符,则它)。 /\bPROVFEADDR=/ 不会吗?甚至只是/\bPROVFEADDR\b/,但您没有正确解释您要实现的目标。

标签: regex perl


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    $response中,PROVFEADDR=后面的字符是双引号,不是单词,所以匹配\W(non-word)。

    它与\b 不匹配,因为它不是单词边界。比较一下:

    if($response =~ /PROVFEADDR\b=/)
    

    这里,R= 之间是一个单词边界。

    【讨论】:

    • 更好的演示可能是/\bPROVFEADDR=/,它可以防止部分匹配:\b 的常见用法。
    • PROVFEADDR 是要匹配的变量。在这种特殊情况下,我必须匹配PROVFEADR=。之前我们使用\W+ 而不是\b。使用\W+,问题是我们必须在字符串末尾匹配。 \W+ 期望至少有一个 \W 如果它位于字符串的最后一个则不存在。所以我用在上述场景中工作的\b 替换。有什么可以处理这两种情况的建议吗?
    • @Nitesh 使用否定的前瞻断言:(?!\w)。它也将匹配行尾。 (注意我用的是\w而不是\W
    猜你喜欢
    • 2015-11-16
    • 2022-07-06
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多