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

rmbxnbpk  于 2023-03-31  发布在  其他
关注(0)|答案(7)|浏览(168)

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

/($word)/i

问题是,如果我使用/(Foo)/i,那么像Food这样的单词会被匹配。
当单词Foo位于句子的开头、中间或结尾时,如何修改表达式使其仅匹配单词Foo

c7rzv4ha

c7rzv4ha1#

使用单词边界:

/\b($word)\b/i

或者如果你正在搜索“S.P.E.C.T.R.E.”,就像希南Ünür的例子一样:

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

lzfw57am2#

要匹配任何完整的单词,请使用模式(\w+)

假设你正在使用PCRE或类似的东西:

上面的屏幕截图取自此示例:https://regex101.com/r/FGheKd/1

(\w+)匹配命令行中的任意整字

我将在Ubuntu 12.10上使用phpsh interactive shell,通过称为preg_match的方法演示PCRE regex engine
启动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不包含。

在命令行中用(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可能是一个问题。要解决这个问题,请在regex中强制单词边界。

将命令行上的文字与单词边界进行匹配。

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

因此,除了内容中不存在具有\b单词边界的单词fart之外,它与前面的示例相同:一米一米一。

eagi6jfj

eagi6jfj3#

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

输出:

Compiling REx "\b(S\.P\.E\.C\.T\.R\.E\.)\b"
Final program:
   1: BOUND (2)
   2: OPEN1 (4)
   4:   EXACT  (9)
   9: CLOSE1 (11)
  11: BOUND (12)
  12: END (0)
anchored "S.P.E.C.T.R.E." at 0 (checking anchored) stclass BOUND minlen 14
Guessing start of match in sv for REx "\b(S\.P\.E\.C\.T\.R\.E\.)\b" against "S.P
.E.C.T.R.E. (Special Executive for Counter-intelligence,"...
Found anchored substr "S.P.E.C.T.R.E." at offset 0...
start_shift: 0 check_at: 0 s: 0 endpos: 1
Does not contradict STCLASS...
Guessed: match at offset 0
Matching REx "\b(S\.P\.E\.C\.T\.R\.E\.)\b" against "S.P.E.C.T.R.E. (Special Exec
utive for Counter-intelligence,"...
   0           |  1:BOUND(2)
   0           |  2:OPEN1(4)
   0           |  4:EXACT (9)
  14      |  9:CLOSE1(11)
  14      | 11:BOUND(12)
                                  failed...
Match failed
Freeing REx: "\b(S\.P\.E\.C\.T\.R\.E\.)\b"
1qczuiv0

1qczuiv04#

对于那些想要在代码中验证枚举的人,您可以遵循指南
在正则表达式世界中,你可以使用^作为字符串的开始,$作为字符串的结束。将它们与|结合使用可能是你想要的:
^(Male)$|^(Female)$
它只会在MaleFemale的情况下返回true。

vngu2lb8

vngu2lb85#

如果您正在使用Notepad++

[\w]+

会给予你整个单词,你可以添加括号来得到它作为一个组。例如:conv1 = Conv2D(64, (3, 3), activation=LeakyReLU(alpha=a), padding='valid', kernel_initializer='he_normal')(inputs)。我想把LeakyReLU作为注解移动到它自己的行中,并替换当前的激活。在notepad++中,可以使用下面的find命令来完成:

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

而replace命令变为:

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

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

rqmkfv5c

rqmkfv5c6#

使用字边界\b,
下面的代码(使用四个转义)在我的环境中工作:Mac,safari版本10.0.3(12602.4.8)

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

r3i60tvu7#

获取字符串中的所有“单词”
/([^\s]+)/g
基本上^/s意味着在空格上断开(或匹配非空格的组)
不要忘记贪婪的g

试试:

"Not the answer you're looking for? Browse other questions tagged regex word-boundary or ask your own question.".match(/([^\s]+)/g)
→(17)['Not',' the','answer',“you're”,' looking','for?','Browse',' other','questions','tagged',' regex','word-boundary',' or','ask',' your','own',' question']

相关问题