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

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

/($word)/i

问题是,如果我使用/(Foo)/i那么像Food这样的词会匹配。 在单词的两边都需要有空格或单词边界。

在句子的开头,中间或结尾处,如何修改我的表达式以匹配单词Foo


使用单词边界:

/b($word)b/i

或者如果您正在像SinanÜnür的例子那样搜索“SPECTER”:

/(?:W|^)(Q$wordE)(?:W|$)/i

要匹配任何整个单词,您可以使用模式(w+)

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

在这里输入图像描述

以上截图来自这个现场示例:http://regex101.com/r/cU5lC2

在命令行中匹配任何整个单词(w+)

我将使用Ubuntu 12.10上的phpsh交互式shell通过称为preg_match的方法来演示PCRE正则表达式引擎

启动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方法使用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或放屁。 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('(bdartb|bfartb)', $gun1);
1

php> echo preg_match('(bdartb|bfartb)', $gun2);
1

php> echo preg_match('(bdartb|bfartb)', $gun3);
0

php> echo preg_match('(bdartb|bfartb)', $gun4);
0

因此,它是相同的,只是这个词前面的例子fartb字边界中不存在内容: 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$wordE)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"
链接地址: http://www.djcxy.com/p/77003.html

上一篇: Regex match entire words only

下一篇: How can I negate this regex?