141

我想匹配整个单词的正则表达式。

在下面的示例中,我尝试匹配sorseason但我有匹配s, e,a和. on

[s|season]

如何使正则表达式匹配整个单词?

4

4 回答 4

170

方括号用于字符类,您实际上是在尝试匹配以下任何一个:s, |, s(again), e, a, s(again)on.

使用括号代替分组:

(s|season)

或非捕获组:

(?:s|season)

注意:非捕获组告诉引擎它不需要存储匹配项,而另一个(捕获组需要)。对于小东西,无论是工作,对于“重型”的东西,你可能想先看看你是否需要匹配。如果你不这样做,最好使用非捕获组来分配更多内存用于计算,而不是存储你永远不需要使用的东西。

于 2013-08-23T12:07:53.007 回答
156

使用此实时在线​​示例来测试您的模式:

在此处输入图像描述

以上截图取自此现场示例:https ://regex101.com/r/cU5lC2/1

匹配命令行上的任何整个单词。

我将在Ubuntu 12.10上使用phpsh 交互式 shell ,通过preg_match方法演示PCRE 正则表达式引擎

启动phpsh,将一些内容放入变量中,匹配word。

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 不包含。

在没有单词边界的情况下匹配命令行上的特定单词

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty 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

变量gun1gun2包含字符串dart或者fart哪个是正确的,但是gun3包含darty并且仍然匹配,这就是问题所在。所以进入下一个例子。

将命令行上的特定单词与单词边界匹配:

Word Boundaries 可以与 强制匹配\b,请参阅: 来自 jex.im/regulex 的 wordboundary 正在做什么的可视化分析

http://jex.im/regulexhttps://github.com/JexCheng/regulex获取的正则表达式视觉图像 示例:

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty 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断言我们有一个单词边界,确保“dart”匹配,但“darty”不匹配。

于 2014-01-06T17:31:45.297 回答
5

我在js中测试示例。最简单的解决方案 - 只需在 / / 中添加您需要的单词:

var reg = /cat/;
reg.test('some cat here');//1 test
true // result
reg.test('acatb');//2 test
true // result

现在,如果您需要这个带有边界的特定单词,而不是在任何其他标志字母内。我们使用b标记:

var reg = /\bcat\b/
reg.test('acatb');//1 test 
false // result
reg.test('have cat here');//2 test
true // result

我们在 js 中也有 exec() 方法,它返回对象结果。它有助于 fg 获取有关我们单词的位置/索引的信息。

var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5

如果我们需要获取字符串/句子/文本中所有匹配的单词,我们可以使用 g 修饰符(全局匹配):

"cat good cat good cat".match(/\bcat\b/g).length
// 3 

现在是最后一个 - 我不需要 1 个特定的词,但其中一些。我们使用 | 符号,表示选择/或。

"bad dog bad".match(/\bcat|dog\b/g).length
// 1
于 2016-11-12T13:33:26.540 回答
2

[ ]定义一个字符类。所以你在那里设置的每个字符都会匹配。[012]将匹配0or 1or2并且[0-2]行为相同。

你想要的是分组来定义一个或语句。用于(s|season)您的问题。

顺便提一句。你必须小心。普通正则表达式(或分组内)中的元字符与字符类不同。字符类就像子语言。[$A]只会匹配$or A,没有别的。没有为美元逃跑。

于 2013-08-23T12:09:37.350 回答