我想匹配整个单词的正则表达式。
在下面的示例中,我尝试匹配s
orseason
但我有匹配s
, e
,a
和. o
n
[s|season]
如何使正则表达式匹配整个单词?
我想匹配整个单词的正则表达式。
在下面的示例中,我尝试匹配s
orseason
但我有匹配s
, e
,a
和. o
n
[s|season]
如何使正则表达式匹配整个单词?
方括号用于字符类,您实际上是在尝试匹配以下任何一个:s
, |
, s
(again), e
, a
, s
(again)o
和n
.
使用括号代替分组:
(s|season)
或非捕获组:
(?:s|season)
注意:非捕获组告诉引擎它不需要存储匹配项,而另一个(捕获组需要)。对于小东西,无论是工作,对于“重型”的东西,你可能想先看看你是否需要匹配。如果你不这样做,最好使用非捕获组来分配更多内存用于计算,而不是存储你永远不需要使用的东西。
以上截图取自此现场示例:https ://regex101.com/r/cU5lC2/1
我将在Ubuntu 12.10上使用phpsh 交互式 shell ,通过preg_match方法演示PCRE 正则表达式引擎
启动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 不包含。
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
变量gun1
和gun2
包含字符串dart
或者fart
哪个是正确的,但是gun3包含darty
并且仍然匹配,这就是问题所在。所以进入下一个例子。
Word Boundaries 可以与 强制匹配\b
,请参阅:
从http://jex.im/regulex和https://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() 方法,它返回对象结果。它有助于 fg 获取有关我们单词的位置/索引的信息。
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
现在是最后一个 - 我不需要 1 个特定的词,但其中一些。我们使用 | 符号,表示选择/或。
"bad dog bad".match(/\bcat|dog\b/g).length
// 1
[ ]
定义一个字符类。所以你在那里设置的每个字符都会匹配。[012]
将匹配0
or 1
or2
并且[0-2]
行为相同。
你想要的是分组来定义一个或语句。用于(s|season)
您的问题。
顺便提一句。你必须小心。普通正则表达式(或分组内)中的元字符与字符类不同。字符类就像子语言。[$A]
只会匹配$
or A
,没有别的。没有为美元逃跑。