我有一个正则表达式表达式,用于查找给定内容块中不区分大小写的所有单词,这些单词包含在数据库中存储的词汇表中。这是我的模式:
/($word)/i
问题是,如果我使用/(Foo)/i
然后Food
匹配之类的词。单词的两边都必须有空格或单词边界。
Foo
当它是句子开头,中间或结尾的单词时,如何修改表达式以仅匹配单词?
Answers:
使用单词边界:
/\b($word)\b/i
或者,如果您在SinanÜnür的示例中搜索“ SPECTRE”,则:
/(?:\W|^)(\Q$word\E)(?:\W|$)/i
\b(<|>=)\b
不匹配>=
\b[-|+][0-9]+\b
匹配。我都不想要。+10
43E+10
(\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
。
使用\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”
对于那些想要在其代码中验证枚举的人,可以按照指南进行操作
在Regex World中,您可以^
用来开始和$
结束字符串。|
您可能想要结合使用它们:
^(Male)$|^(Female)$
这将只返回trueMale
或Female
情况。
^
并$
匹配行的开头(分别是结尾),因此,只有那些是行中的唯一单词,您的示例才会匹配。
如果您在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\)
这些空格是为了在我的代码中保留正确的格式。:)