Regex match entire words only

我有一个 regex 表达式,用于查找存储在数据库中的术语表中的给定内容块(不区分大小写)中的所有单词。我的模式是这样的:

/($word)/i

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

如何修改我的表达式,以匹配只有单词 Foo时,它是一个词在开头,中间,或结束的一个句子?

392617 次浏览

使用单词边界:

/\b($word)\b/i

或者如果你在搜索“ S.P.E.C.T.R.E.”,就像 Sinan Ünür 的例子:

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

使用 \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";
}

Output:

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"

为了匹配任何整个单词,您将使用模式 (\w+)

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

enter image description here

上面的截图取自这个实例: http://regex101.com/r/cU5lC2

将命令行上的任何整个单词与 (\w+)匹配

我将使用 Ubuntu 12.10上的 交互式 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 引擎以 (\w)+模式分析变量: $content1$content2$content3

$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包含字符串省道或屁。Gun4没有。然而,查找单词 fartfarty匹配可能是一个问题。要解决这个问题,请在正则表达式中强制使用单词边界。

Match literal words on the commandline with word boundaries.

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

因此,它与前面的示例相同,只是内容 farty中不存在具有 \b单词边界的单词 fart

使用单词边界,

The following (using four escapes) works in my environment: Mac, safari Version 10.0.3 (12602.4.8)

var myReg = new RegExp(‘\\\\b’+ variable + ‘\\\\b’, ‘g’)

如果你在记事本 + + 中做这件事

[\w]+

会给你整个单词,你可以添加括号,得到它作为一个组。例子: conv1 = Conv2D(64, (3, 3), activation=LeakyReLU(alpha=a), padding='valid', kernel_initializer='he_normal')(inputs)。我想将 LeakyReLU移动到它自己的行作为注释,并替换当前的激活。在记事本 + + 中,这可以使用以下 find 命令完成:

([\w]+)( = .+)(LeakyReLU.alpha=a.)(.+)

替换命令变成:

\1\2'relu'\4 \n    # \1 = LeakyReLU\(alpha=a\)\(\1\)

这些空格是为了在我的代码中保持正确的格式。 :)

将所有“单词”放在一个字符串中

/([^\s]+)/g

基本上 ^/s意味着在空格上断开(或匹配非空格组)
Don't forget the g for Greedy

试试看:

"Not the answer you're looking for? Browse other questions tagged regex word-boundary or ask your own question.".match(/([^\s]+)/g)

→(17)[‘ Not’,‘ the’,‘ answer’,‘ you’re’,‘ looking’,‘ for?’,‘ Browse’,‘ other’,‘ questions’,‘ tags’,‘ regex’,‘ word-bound’,‘ or’,‘ ask’,‘ your’,‘ own’,‘ questions’]

For Those who want to validate an Enum in their code you can following the guide

在正则表达式世界中,可以使用 ^来启动字符串,使用 $来结束字符串。将它们与 |结合使用可能是你想要的:

^(Male)$|^(Female)$

只有在 MaleFemale的情况下,它才会返回 true。