正则表达式匹配单词或其前缀

时间:2013-08-23 12:05:34

标签: regex expression word

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

在以下示例中,我尝试匹配sseason,但匹配sea,{{1} }和o

n

如何制作正则表达式以匹配整个单词?

4 个答案:

答案 0 :(得分:119)

方括号适用于字符类,您实际上是在尝试匹配以下任何一个:s|s(再次),eas(再次),on

请使用括号进行分组:

(s|season)

或非捕获组:

(?:s|season)

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

答案 1 :(得分:107)

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

enter image description here

从此实例中截取的屏幕截图:https://regex101.com/r/cU5lC2/1

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

我将使用phpsh interactive shell上的Ubuntu 12.10通过称为PCRE regex engine的方法展示preg_match

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

匹配命令行上的特定单词而不使用单词bountaries

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包含正确的字符串dartfart,但gun3包含darty且仍匹配,这就是问题所在。所以进入下一个例子。

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

Word Boundaries可与\b强制匹配,请参阅: Visual analysis of what wordboundary is doing from jex.im/regulex

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”不匹配。

答案 2 :(得分:3)

我在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()方法,它返回object-result。它有助于f.g.获取有关我们这个词的地点/索引的信息。

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 

现在是最后一个 - 我不需要一个特定的词,但其中一些。我们用|签字,这意味着选择/或。

"bad dog bad".match(/\bcat|dog\b/g).length
// 1

答案 3 :(得分:2)

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

您想要的是分组来定义or-statement。使用(s|season)解决您的问题。

顺便说一下。你必须要小心。正常正则表达式(或分组内)中的元字符与字符类不同。字符类就像一种子语言。 [$A]只会匹配$A,而不会匹配。没有逃避这里的美元。

相关问题