Answers:
方括号意味着字符类,和你实际尝试匹配的任何一个:s
,|
,s
(再次), ,e
,a
(s
再次),o
和n
。
使用括号代替分组:
(s|season)
或非捕获组:
(?:s|season)
注意:非捕获组告诉引擎它不需要存储匹配项,而另一组(捕获组则需要存储)。对于小东西,无论哪种都适用;对于“重型”东西,则可能需要首先查看是否需要匹配。如果不这样做,最好使用非捕获组为计算分配更多的内存,而不是存储不需要使用的内存。
?:
内部分组又名non-capturing
只是说,你不能使用与匹配的表达式$1
,$2
等等...如果你想,一个表达式不匹配,你需要的是^
。
(?! ... )
则将使用insead,(?!s|season)
在这种情况下,这意味着。
上面的截图来自此实时示例:https : //regex101.com/r/cU5lC2/1
我将在Ubuntu 12.10上使用phpsh交互式shell通过称为preg_match的方法来演示PCRE regex引擎。
启动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使用的PCRE引擎PHP语言中来分析变量:$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
并且仍然匹配,这就是问题所在。因此,进入下一个示例。
从http://jex.im/regulex和https://github.com/JexCheng/regulex获得的Regex Visual Image 示例:
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
断言,我们有一个单词边界,确保“镖”是匹配的,但“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
现在,最后一个-我不需要一个特定的单词,但是其中一些。我们使用 符号,表示选择/或。
"bad dog bad".match(/\bcat|dog\b/g).length
// 1
(season|s)
代替。[season]
匹配任何s
,e
,a
,o
,n
。