正则expression式只匹配整个单词

我有一个正则expression式,我用它来查找给定的内容块中的所有单词,不区分大小写,包含在存储在数据库中的词汇表中。 这是我的模式:

/($word)/i 

问题是,如果我使用/(Foo)/i然后像Food这样的Food匹配。 在单词的两边都需要有空格或单词边界。

在句子的开头,中间或结尾,如何修改我的expression式以匹配单词Foo

使用单词边界:

 /\b($word)\b/i 

或者如果您正在像SinanÜnür的例子那样search“SPECTER”:

 /(?:\W|^)(\Q$word\E)(?:\W|$)/i 

要匹配任何整个单词,您可以使用模式(\w+)

假设你正在使用PCRE或类似的东西:

在这里输入图像描述

以上截图来自这个现场示例: http : //regex101.com/r/cU5lC2

在命令行中匹配任何整个单词(\w+)

我将使用Ubuntu 12.10上的phpsh交互式shell来通过称为preg_match的方法来演示PCRE正则expression式引擎

启动phpsh,把一些内容放入一个variables,匹配单词。

 el@apollo:~/foo$ phpsh php> $content1 = 'badger' php> $content2 = '1234' php> $content3 = '$%^&' php> echo preg_match('(\w+)', $content1); 1 php> echo preg_match('(\w+)', $content2); 1 php> echo preg_match('(\w+)', $content3); 0 

preg_match方法使用PHP语言中的PCRE引擎来分析variables: $content1$content2$content3以及(\w)+模式。

$ content1和$ content2至less包含一个单词,$ content3不包含。

在命令行上匹配一些字面的单词(dart|fart)

 el@apollo:~/foo$ phpsh php> $gun1 = 'dart gun'; php> $gun2 = 'fart gun'; php> $gun3 = 'farty gun'; php> $gun4 = 'unicorn gun'; php> echo preg_match('(dart|fart)', $gun1); 1 php> echo preg_match('(dart|fart)', $gun2); 1 php> echo preg_match('(dart|fart)', $gun3); 1 php> echo preg_match('(dart|fart)', $gun4); 0 

variablesgun1和gun2包含stringdart或放屁。 gun4不。 然而,寻找单词fart可能是一个问题。 要解决这个问题,请在正则expression式中强制使用单词边界。

将命令行上的文字与词边界匹配。

 el@apollo:~/foo$ phpsh php> $gun1 = 'dart gun'; php> $gun2 = 'fart gun'; php> $gun3 = 'farty gun'; php> $gun4 = 'unicorn gun'; php> echo preg_match('(\bdart\b|\bfart\b)', $gun1); 1 php> echo preg_match('(\bdart\b|\bfart\b)', $gun2); 1 php> echo preg_match('(\bdart\b|\bfart\b)', $gun3); 0 php> echo preg_match('(\bdart\b|\bfart\b)', $gun4); 0 

所以和前面的例子一样,不同之处在于内容中不存在带有\b字边界的字fartyfarty

使用\b可以产生令人惊讶的结果。 你最好弄清楚是什么把一个词从它的定义中分离出来,并把这些信息合并到你的模式中。

 #!/usr/bin/perl use strict; use warnings; use re 'debug'; my $str = 'SPECTRE (Special Executive for Counter-intelligence, Terrorism, Revenge and Extortion) is a fictional global terrorist organisation'; my $word = 'SPECTRE'; if ( $str =~ /\b(\Q$word\E)\b/ ) { print $1, "\n"; } 

输出:

编译REx“\ b(S \ .P \ .E \ .C \ .T \ .R \ .E \。)\ b”
最终节目:
    1:结界(2)
    2:OPEN1(4)
    4:确切(9)
    9:CLOSE1(11)
   11:结界(12)
   12:结束(0)
将“SPECTER”锚定在0(检查锚定)stclass BOUND minlen 14
推测在REV“\ b(S \ .P \ .E \ .C \ .T \ .R \ .E \。)\ b”对“SP
 。反恐精英特别行政人员
在偏移0处find锚定的substr“SPECTER”...
 start_shift:0 check_at:0 s:0 endpos:1
不违反STCLASS ...
猜测:匹配在偏移量0
将REx“\ b(S \ .P \ .E \ .C \ .T \ .R \ .E \。)\ b”与“SPECTER(Special Exec
反情报的工作,“...
    0 |  1:结合的(2)
    0 |  2:OPEN1(4)
    0 |  4:确切(9)
   14 |  9:CLOSE1(11)
   14 |  11:结合的(12)
                                  失败...
比赛失败
释放REx:“\ b(S \ .P \ .E \ .C \ .T \ .R \ .E \。)\ b”