Aar*_*ron 79 regex word-boundary
我有一个正则表达式,我用它来查找给定内容块中的所有单词,不区分大小写,包含在存储在数据库中的词汇表中.这是我的模式:
/($word)/i
Run Code Online (Sandbox Code Playgroud)
问题是,如果我使用/(Foo)/i那么像Food匹配的话.在单词的两边都需要有空格或单词边界.
Foo如果单词在句子的开头,中间或结尾处是单词时,如何修改我的表达式以仅匹配单词?
Ric*_*ões 100
使用单词边界:
/\b($word)\b/i
Run Code Online (Sandbox Code Playgroud)
或者,如果你在SinanÜnür的例子中搜索"SPECTER":
/(?:\W|^)(\Q$word\E)(?:\W|$)/i
Run Code Online (Sandbox Code Playgroud)
Eri*_*ski 38
(\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
Run Code Online (Sandbox Code Playgroud)
该方法的preg_match使用的PCRE引擎PHP语言中来分析变量:$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
Run Code Online (Sandbox Code Playgroud)
变量gun1和gun2包含字符串dart或fart.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('(\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
Run Code Online (Sandbox Code Playgroud)
所以它与前面的例子相同,只是内容中不存在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$word\E)\b/ ) {
print $1, "\n";
}
Run Code Online (Sandbox Code Playgroud)
输出:
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"
对于那些想要在代码中验证枚举的人,您可以按照指南进行操作
在 Regex World 中,您可以用于^开始和$结束字符串。结合使用它们|可能就是您想要的:
^(Male)$|^(Female)$
Run Code Online (Sandbox Code Playgroud)
Male仅对于or情况才会返回 true Female。