正则表达式仅匹配整个单词


90

我有一个正则表达式表达式,用于查找给定内容块中不区分大小写的所有单词,这些单词包含在数据库中存储的词汇表中。这是我的模式:

/($word)/i

问题是,如果我使用/(Foo)/i然后Food匹配之类的词。单词的两边都必须有空格或单词边界。

Foo当它是句子开头,中间或结尾的单词时,如何修改表达式以仅匹配单词?

Answers:


120

使用单词边界:

/\b($word)\b/i

或者,如果您在SinanÜnür的示例中搜索“ SPECTRE”,则:

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

1
当您发布时,我只是在输入此答案的简写版本。:)
ZombieSheep

@RichardSimoes\b(<|>=)\b不匹配>=
alhelal '18

@RichardSimoes并在中进行\b[-|+][0-9]+\b匹配。我都不想要。+1043E+10
alhelal

如果我要搜索未添加或未包含在其他任何单词中的单词怎么办。则此逻辑将不起作用
Prasanna Sasne '18

有人将如何获得数学比较运算符> =和<=?
AntonSack

50

要匹配所有单词,您将使用模式 (\w+)

假设您正在使用PCRE或类似方法:

在此处输入图片说明

上面的截图摘自该实时示例:http : //regex101.com/r/cU5lC2

匹配命令行上的所有单词 (\w+)

我将在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没有。

将命令行上的一些文字与 (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包含字符串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

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


是,下午没话吗?
奴才

如果您想将am和pm强制为单词(不是,则为缩写),然后为您的正则表达式引擎添加点号作为单词字符。对您来说,您似乎已将句点设置为非单词字符,因此正则表达式单词不会一对一,而且在欧洲词典中针对混合欧洲单词的“单词”的标准定义语言(或与此相关的任何其他语言)。
Eric Leschinski

8

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

输出:

编译REx“ \ b(S \ .P \ .E \ .C \ .T \ .R \ .E \。)\ b”
最终程序:
   1:绑定(2)
   2:OPEN1(4)
   4:精确(9)
   9:关闭1(11)
  11:绑定(12)
  12:结束(0)
在0锚定“ SPECTRE”(检查锚定)stclass BOUND minlen 14
猜测SV中REx“ \ b(S \ .P \ .E \ .C \ .T \ .R \ .E \。)\ b”与“ SP”的比赛开始
.ECTRE(反情报特别主管,” ...
在偏移量0处找到锚定的substr“ SPECTRE” ...
start_shift:0 check_at:0 s:0 endpos:1
不矛盾STCLASS ...
猜测:在偏移量0处匹配
匹配REx“ \ b(S \ .P \ .E \ .C \ .T \ .R \ .E \。)\ b”与“ SPECTRE(Special Exec
反情报”,...
   0 | 1:绑定(2)
   0 | 2:OPEN1(4)
   0 | 4:完全(9)
  14 | 9:CLOSE1(11)
  14 | 11:绑定(12)
                                  失败了...
比赛失败
释放REx:“ \ b(S \ .P \ .E \ .C \ .T \ .R \ .E \。)\ b”

1
我认为一个单词通常是\ w单词,但很有趣。
理查德·西蒙斯(RichardSimões)2009年

1

使用单词边界\ b,

以下(使用四个转义符)在我的环境中起作用:Mac,safari版本10.0.3(12602.4.8)

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

1

对于那些想要在其代码中验证枚举的人,可以按照指南进行操作

在Regex World中,您可以^用来开始和$结束字符串。|您可能想要结合使用它们:

^(Male)$|^(Female)$

这将只返回trueMaleFemale情况。


^$匹配行的开头(分别是结尾),因此,只有那些是行中的唯一单词,您的示例才会匹配。
gented

而这正是我想要验证枚举时想要的!问题是什么?
MohamadrezaRahimianGolkhandani

0

如果您在Notepad ++中执行此操作

[\w]+ 

将为您提供整个单词,您可以添加括号以将其作为一个组。范例:conv1 = Conv2D(64, (3, 3), activation=LeakyReLU(alpha=a), padding='valid', kernel_initializer='he_normal')(inputs)。我想LeakyReLU进入自己的一行作为评论,并替换当前的激活。在记事本++中,可以使用以下查找命令完成此操作:

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

并且replace命令变为:

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

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


-1

获取字符串中的所有“单词”

/([^\s]+)/g

基本上^/s意味着打破空格(或匹配非空格组)
不要忘了g贪婪

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.