正则表达式以匹配单词或其前缀

我想匹配整个单词的正则表达式。

在下面的例子中,我试图匹配 sseason,但我有匹配 seaon

[s|season]

如何使正则表达式匹配整个单词?

616858 次浏览

方括号意味着字符类,你实际上正在尝试匹配任何一个: s|s(再次) ,eas(再次) ,on

使用括号代替分组:

(s|season)

或非捕捉组:

(?:s|season)

注意: 非捕获组告诉引擎它不需要存储匹配,而另一个(捕获组)需要存储匹配。对于小东西,要么工作,对于“重型”的东西,你可能想先看看,如果你需要或不匹配。如果没有,那么最好使用非捕获组来分配更多的内存用于计算,而不是存储永远不需要使用的内存。

[ ]定义了一个字符类。所以你设置的每个字符都会匹配。[012]将匹配 012[0-2]行为相同。

您需要的是分组来定义一个或-语句。请使用 (s|season)解决您的问题。

顺便说一句。你得小心点。普通正则表达式(或分组内部)中的元字符不同于字符类。字符类就像一种子语言。[$A]将只匹配 $A,没有其他。不能为了钱逃跑。

使用这个实时在线示例来测试您的模式:

enter image description here

上面的截图取自这个实例: https://regex101.com/r/cU5lC2/1

匹配命令行上的所有单词。

我将使用 Ubuntu 12.10上的 交互式 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 引擎以 (\w)+模式分析变量: $content1$content2$content3

$content1和 $content2至少包含一个单词,$content3不包含。

在命令行上匹配特定的单词,但不要设置单词边界

el@apollo:~/foo$ phpsh


php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty 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

变量 gun1gun2包含字符串 dartfart,这是正确的,但 gun3包含 darty,仍然匹配,这就是问题所在。下一个例子。

使用单词边界匹配命令行上的特定单词:

单词边界可以用力与 \b匹配,参见: Visual analysis of what wordboundary is doing from jex.im/regulex

http://jex.im/regulexhttps://github.com/JexCheng/regulex获得的正则表达式视觉图像示例:

el@apollo:~/foo$ phpsh


php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty 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断言我们有一个单词边界,确保“ dart”匹配,但是“ darty”不匹配。

我在 js 中测试示例。 最简单的解决方案——只要在里面添加你需要的单词//:

var reg = /cat/;
reg.test('some cat here');//1 test
true // result
reg.test('acatb');//2 test
true // result

现在,如果你需要这个带边界的特定单词,不要在任何其他符号-字母内。我们使用 B标记:

var reg = /\bcat\b/
reg.test('acatb');//1 test
false // result
reg.test('have cat here');//2 test
true // result

Js 中还有 exec ()方法,它返回 object-result。它可以帮助 f.g 获得关于我们单词的位置/索引的信息。

var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5

如果我们需要获得字符串/句子/文本中所有匹配的单词,我们可以使用 g 修饰符(全局匹配) :

"cat good cat good cat".match(/\bcat\b/g).length
// 3

现在最后一个-我不需要一个具体的词,但他们中的一些。我们用符号,意思是选择/或。

"bad dog bad".match(/\bcat|dog\b/g).length
// 1
  • 如果你认为“ s”是一个单词,我们可以这样处理,

    \bs\b|\bseason\b

  • 如果你在考虑单词中出现的“ s”,我们可以接近,

    s|\bseason\b