与Perl中的问号完全匹配

时间:2016-10-11 10:53:57

标签: regex perl

我想在字符串数组中找到字符串?Allen,但关键字中有问号,这会导致一些问题。 我编写这段代码来查找数组中的字符串

@arr = ("My name is ?Allen",
"My name is ?Allens",
"My name is s?Allen",
"My name is s?Allens",
"My name is ?allen");
$keyword = "?Allen";
for (my $i=0; $i <= 4; $i++){
  if ($arr[$i] =~ /\b$keyword\b/){
      print "str $i = match\n";
  }else{
      print "str $i = no\n";
  }
}

最后我得到了这个结果

str 0 = match
str 1 = no
str 2 = match
str 3 = no
str 4 = no

但我想找到第一个索引数组作为匹配字符串,如下所示:

str 0 = match
str 1 = no
str 2 = no
str 3 = no
str 4 = no

1 个答案:

答案 0 :(得分:3)

请注意,您的正则表达式包含在实际模式中使用它们之前需要引用的非单词特殊字符。此外,特殊字符可以出现在前导/尾随位置的事实意味着您不能指望\b始终工作相同(因为它的含义取决于上下文)。因此,您可以使用

修复代码
/(?<!\S)\Q$keyword\E(?!\S)/

,其中

  • (?<!\S) - 在
  • 之前需要空白字符或字符串的开头
  • \Q$keyword\E - 文字搜索字符串(请参阅Quoting Metacharacters
  • (?!\S) - 应该跟一个空格或字符串结尾。

\Q...\Ementioned by Dave Cross)的另一种选择是使用quotemeta

  

这是在双引号字符串中实现\Q转义的内部函数。