正则表达式只匹配整个单词
我有一个正则表达式,用于查找给定的内容块中的所有单词,不区分大小写,包含在存储在数据库中的词汇表中。 这是我的模式:
/($word)/i
问题是,如果我使用/(Foo)/i
那么像Food
这样的词会匹配。 在单词的两边都需要有空格或单词边界。
在句子的开头,中间或结尾处,如何修改我的表达式以匹配单词Foo
?
使用单词边界:
/b($word)b/i
或者如果您正在像SinanÜnür的例子那样搜索“SPECTER”:
/(?:W|^)(Q$wordE)(?:W|$)/i
要匹配任何整个单词,您可以使用模式(w+)
假设你正在使用PCRE或类似的东西:
以上截图来自这个现场示例:http://regex101.com/r/cU5lC2
在命令行中匹配任何整个单词(w+)
我将使用Ubuntu 12.10上的phpsh交互式shell通过称为preg_match的方法来演示PCRE正则表达式引擎
启动phpsh,将一些内容放入一个变量,匹配单词。
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引擎来分析变量: $content1
, $content2
和$content3
以及(w)+
模式。
$ content1和$ content2至少包含一个单词,$ 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
变量gun1和gun2包含字符串dart或放屁。 gun4没有。 但是它可能是在寻找一个字一个问题fart
匹配farty
。 要解决此问题,请在正则表达式中强制执行字边界。
将命令行上的文字与词边界匹配。
el@apollo:~/foo$ phpsh
php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'farty gun';
php> $gun4 = 'unicorn gun';
php> echo preg_match('(bdartb|bfartb)', $gun1);
1
php> echo preg_match('(bdartb|bfartb)', $gun2);
1
php> echo preg_match('(bdartb|bfartb)', $gun3);
0
php> echo preg_match('(bdartb|bfartb)', $gun4);
0
因此,它是相同的,只是这个词前面的例子fart
用b
字边界中不存在内容: farty
。
使用b
可以产生令人惊讶的结果。 你最好搞清楚一个词与其定义之间的区别,并将这些信息合并到你的模式中。
#!/usr/bin/perl
use strict; use warnings;
use re 'debug';
my $str = 'S.P.E.C.T.R.E. (Special Executive for Counter-intelligence,
Terrorism, Revenge and Extortion) is a fictional global terrorist
organisation';
my $word = 'S.P.E.C.T.R.E.';
if ( $str =~ /b(Q$wordE)b/ ) {
print $1, "n";
}
输出:
Compiling REx "b(S.P.E.C.T.R.E.)b" Final program: 1: BOUND (2) 2: OPEN1 (4) 4: EXACT (9) 9: CLOSE1 (11) 11: BOUND (12) 12: END (0) anchored "S.P.E.C.T.R.E." at 0 (checking anchored) stclass BOUND minlen 14 Guessing start of match in sv for REx "b(S.P.E.C.T.R.E.)b" against "S.P .E.C.T.R.E. (Special Executive for Counter-intelligence,"... Found anchored substr "S.P.E.C.T.R.E." at offset 0... start_shift: 0 check_at: 0 s: 0 endpos: 1 Does not contradict STCLASS... Guessed: match at offset 0 Matching REx "b(S.P.E.C.T.R.E.)b" against "S.P.E.C.T.R.E. (Special Exec utive for Counter-intelligence,"... 0 | 1:BOUND(2) 0 | 2:OPEN1(4) 0 | 4:EXACT (9) 14 | 9:CLOSE1(11) 14 | 11:BOUND(12) failed... Match failed Freeing REx: "b(S.P.E.C.T.R.E.)b"链接地址: http://www.djcxy.com/p/77003.html