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


119

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

在下面的例子中,我试图匹配sseason只把我所有的比赛seaon

[s|season]

如何做一个正则表达式来匹配整个单词?


4
使用(season|s)代替。[season]匹配任何seaon
falsetru

Answers:


137

方括号意味着字符类,和你实际尝试匹配的任何一个:s|s(再次), ,eas再次),on

使用括号代替分组:

(s|season)

或非捕获组:

(?:s|season)

注意:非捕获组告诉引擎它不需要存储匹配项,而另一组(捕获组则需要存储)。对于小东西,无论哪种都适用;对于“重型”东西,则可能需要首先查看是否需要匹配。如果不这样做,最好使用非捕获组为计算分配更多的内存,而不是存储不需要使用的内存。


是的,我已经意识到这一点。我不需要捕捉。我以为使用()总是匹配的,知道有一个不匹配的选项很方便,谢谢。
NMGod

你误会了。该?:内部分组又名non-capturing只是说,你不能使用与匹配的表达式$1$2等等...如果你想,一个表达式不匹配,你需要的是^
EverythingRightPlace

@ NMGodA1b2c3d4不客气!您的意思是不匹配或不匹配的选项吗(有区别,是的)。如果您不想匹配其中任何一个,(?! ... )则将使用insead,(?!s|season)在这种情况下,这意味着。
杰里

126

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

在此处输入图片说明

上面的截图来自此实时示例:https : //regex101.com/r/cU5lC2/1

匹配命令行上的所有单词。

我将在Ubuntu 12.10上使用phpsh交互式shell通过称为preg_match的方法来演示PCRE regex引擎。

启动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使用的PCRE引擎PHP语言中来分析变量:$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包含字符串dartfart正确的字符串,但是gun3包含darty并且仍然匹配,这就是问题所在。因此,进入下一个示例。

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

可以使用来强制匹配单词边界\b,请参阅: 从jex.im/regulex视觉分析单词边界在做什么

http://jex.im/regulexhttps://github.com/JexCheng/regulex获得的Regex Visual Image 示例:

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断言,我们有一个单词边界,确保“镖”是匹配的,但“DARTY”不是。


3
投票是因为我需要\ b char,但不知道!
Nieminen

为什么这种详尽的解释不能回答?
dewwwald

1
因为发布问题的人选择了第一个答案,所以当我的上等答案更高时,我便不愿转向我的答案。您可以通过在问题下方的注释来询问发问者,以将其答案选择更改为该问题,这将提高此页面对落入该页面的人的价值。
Eric Leschinski

1
我之所以投票,是因为您在示例中使用了“放屁”一词...并且我需要\ w +;)
SomethingOn '18


4

我在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 

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

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

2

[ ]定义一个字符类。因此,您在此处设置的每个字符都会匹配。[012]将匹配01或,2并且[0-2]行为相同。

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

顺便说一句。你要当心 常规正则表达式(或分组内部)中的元字符与字符类不同。字符类就像是子语言。[$A]只会匹配$A,没有别的。这里没有逃脱美元。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.