正则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
字边界的字farty
: farty
。
使用\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”