Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式只匹配整个单词_Regex_Word Boundary - Fatal编程技术网

Regex 正则表达式只匹配整个单词

Regex 正则表达式只匹配整个单词,regex,word-boundary,Regex,Word Boundary,我有一个正则表达式,用于查找给定内容块中的所有单词,不区分大小写,它们包含在数据库中存储的词汇表中。这是我的模式: /($word)/i 问题是,如果我使用/(Foo)/I,那么像食物这样的词就会匹配。单词的两边必须有空格或单词边界 当单词位于句子的开头、中间或结尾时,如何修改表达式以仅匹配单词Foo?使用单词边界: /\b($word)\b/i 或者,如果你正在搜索“S.p.E.C.T.R.E.”,比如西南努尔的例子: /(?:\W|^)(\Q$word\E)(?:\W|$)/i 使用单

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

/($word)/i
问题是,如果我使用
/(Foo)/I
,那么像
食物这样的词就会匹配。单词的两边必须有空格或单词边界

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

使用单词边界:

/\b($word)\b/i
或者,如果你正在搜索“S.p.E.C.T.R.E.”,比如西南努尔的例子:

/(?:\W|^)(\Q$word\E)(?:\W|$)/i
使用单词边界:

/\b($word)\b/i
或者,如果你正在搜索“S.p.E.C.T.R.E.”,比如西南努尔的例子:

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

使用
\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" 编译REx“\b(S\.P\.E\.C\.T\.R\.E\.)\b” 最终课程: 1:绑定(2) 2:OPEN1(4) 4:精确(9) 9:1(11) 11:已绑定(12) 12:完(0) 锚定“S.P.E.C.T.R.E.”在0(检查锚定)stclass边界最小14处 在sv中猜测雷克斯“\b(S\.P\.E\.C\.T\.R\.E\)\b”对“S.P”的比赛开始 E.C.T.R.E.(反情报特别执行官,”。。。 在偏移量0处发现锚定的substr“S.P.E.C.T.R.E.”。。。 开始位置:0检查位置:0秒:0结束位置:1 不矛盾的STCLASS。。。 猜测:在偏移量0处匹配 将REx“\b(S\.P\.E\.C\.T\.R\.E\)\b”与“S.P.E.C.T.R.E.(特别执行官 反情报用途,“。。。 0 | 1:界(2) 0 | 2:OPEN1(4) 0 | 4:精确(9) 14 | 9:CLOSE1(11) 14 | 11:绑定(12) 失败。。。 比赛失败 释放雷克斯:“\b(S\.P\.E\.C\.T\.R\.E\)\b”
使用
\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" 编译REx“\b(S\.P\.E\.C\.T\.R\.E\.)\b” 最终课程: 1:绑定(2) 2:OPEN1(4) 4:精确(9) 9:1(11) 11:已绑定(12) 12:完(0) 锚定“S.P.E.C.T.R.E.”在0(检查锚定)stclass边界最小14处 在sv中猜测雷克斯“\b(S\.P\.E\.C\.T\.R\.E\)\b”对“S.P”的比赛开始 E.C.T.R.E.(反情报特别执行官,”。。。 在偏移量0处发现锚定的substr“S.P.E.C.T.R.E.”。。。 开始位置:0检查位置:0秒:0结束位置:1 不矛盾的STCLASS。。。 猜测:在偏移量0处匹配 将REx“\b(S\.P\.E\.C\.T\.R\.E\)\b”与“S.P.E.C.T.R.E.(特别执行官 反情报用途,“。。。 0 | 1:界(2) 0 | 2:OPEN1(4) 0 | 4:精确(9) 14 | 9:CLOSE1(11) 14 | 11:绑定(12) 失败。。。 比赛失败 释放雷克斯:“\b(S\.P\.E\.C\.T\.R\.E\)\b” 要匹配整个单词,您可以使用模式
(\w+)
假设您正在使用PCRE或类似产品:

以上截图摘自本实例:

将命令行上的所有单词与
(\w+)
我将使用on通过称为

启动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)
变量gun1和gun2包含字符串dart或fart。gun4不包含。但是查找单词
fart
匹配
farty
可能会有问题。若要解决此问题,请在正则表达式中强制执行单词边界

将命令行上的文字与单词边界匹配。 因此,它与上一个示例相同,只是内容中不存在带有
\b
单词边界的
fart
farty

要匹配任何整个单词,您将使用模式
(\w+)
假设您正在使用PCRE或类似产品:

以上截图摘自本实例:

将命令行上的所有单词与
(\w+)
我将使用on通过称为

启动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)
变量gun1和gun2包含字符串dart或fart。gun4不包含。但是查找单词
fart
匹配
farty
可能会有问题。若要解决此问题,请在正则表达式中强制执行单词边界

将命令行上的文字与单词边界匹配。
因此,它与上一个示例相同,只是内容中不存在带有
\b
单词边界的单词
fart
farty
,使用单词边界\b

以下内容(使用四个转义)适用于我的环境:Mac,safari版本10.0.3(12602.4.8)


使用单词边界\b

以下内容(使用四个转义)适用于我的环境:Mac,safari版本10.0.3(12602.4.8)


如果你是在记事本上做的++

[\w]+ 
将为您提供整个单词,您可以添加括号将其作为一个组。例如:
conv1=Conv2D(64,(3,3),activation=LeakyReLU(alpha=a),padding='valid',kernel\u initializer='he\u normal')(inputs)
。我想将
LeakyReLU
移动到