我想在整个单词上匹配正则表达式。在下面的示例中,我试图匹配s或season,但我得到的匹配项是s、e、a、o和n。
s
season
e
a
o
n
[s|season]
如何使正则表达式匹配整个单词?
3ks5zfa01#
方括号用于字符类,实际上您尝试匹配以下任何一个:s、|、s(再次)、e、a、s(再次)、o和n。使用括号代替分组:
|
(s|season)
或非捕获组:
(?:s|season)
注:非捕获组告诉引擎它不需要存储匹配项,而另一个组(捕获组)需要存储匹配项。对于小数据,这两种方法都有效;对于“大数据”,您可能希望首先确定是否需要匹配项。如果不需要,最好使用非捕获组来分配更多内存用于计算,而不是存储永远不需要使用的内容。
olmpazwi2#
上面的屏幕截图取自此示例:https://regex101.com/r/cU5lC2/1
我将使用Ubuntu 12.10上的phpsh interactive shell,通过名为preg_match的方法演示PCRE regex engine启动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不包含。
$content1
$content2
$content3
(\w)+
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,仍然匹配,这就是问题所在。
gun1
gun2
dart
fart
darty
可以使用\b强制匹配字边界,请参阅:
\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
\bAssert我们有一个单词边界,确保“dart“匹配,但“darty“不匹配。
g52tjvyc3#
最简单的解决方案I-只需要在/ /里面添加你需要的单词:
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()方法,它返回对象-结果。它帮助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
avkwfej44#
[ ]定义了一个字符类。所以你在那里设置的每个字符都将匹配。[012]将匹配0或1或2,[0-2]的行为也是一样的。您需要的是定义OR语句的分组。请使用(s|season)来解决您的问题。顺便说一句,你必须小心。普通正则表达式(或分组)中的元字符与字符类是不同的。字符类就像一个子语言。[$A]只匹配$或A,没有其他内容。这里没有转义。
[ ]
[012]
0
1
2
[0-2]
[$A]
$
A
v09wglhw5#
\bs\b|\bseason\b
s|\bseason\b
5条答案
按热度按时间3ks5zfa01#
方括号用于字符类,实际上您尝试匹配以下任何一个:
s
、|
、s
(再次)、e
、a
、s
(再次)、o
和n
。使用括号代替分组:
或非捕获组:
注:非捕获组告诉引擎它不需要存储匹配项,而另一个组(捕获组)需要存储匹配项。对于小数据,这两种方法都有效;对于“大数据”,您可能希望首先确定是否需要匹配项。如果不需要,最好使用非捕获组来分配更多内存用于计算,而不是存储永远不需要使用的内容。
olmpazwi2#
使用以下在线示例测试您的模式:
上面的屏幕截图取自此示例:https://regex101.com/r/cU5lC2/1
匹配命令行上的任何全字。
我将使用Ubuntu 12.10上的phpsh interactive shell,通过名为preg_match的方法演示PCRE regex engine
启动phpsh,将一些内容放入变量中,匹配word。
preg_match方法使用PHP语言中的PCRE引擎来分析变量:
$content1
、$content2
和$content3
与(\w)+
模式的组合。$content1和$content2至少包含一个单词,$content3不包含。
匹配命令行上的特定单词,不带单词边界
变量
gun1
和gun2
包含字符串dart
或fart
,这是正确的,但gun3包含darty
,仍然匹配,这就是问题所在。将命令行上的特定单词与单词边界匹配:
可以使用
\b
强制匹配字边界,请参阅:从http://jex.im/regulex和https://github.com/JexCheng/regulex获取的正则表达式可视图像示例:
\b
Assert我们有一个单词边界,确保“dart“匹配,但“darty“不匹配。g52tjvyc3#
最简单的解决方案I-只需要在/ /里面添加你需要的单词:
现在,如果你需要这个特定的单词有边界,而不是在任何其他的符号-字母。我们使用b标记:
我们在js中也有exec()方法,它返回对象-结果。它帮助f.g.获得关于我们单词的位置/索引的信息。
如果我们需要得到字符串/句子/文本中所有匹配的单词,我们可以使用g修饰符(全局匹配):
现在最后一个-我不需要一个具体的词,但他们中的一些。我们使用|符号,表示选择/或。
avkwfej44#
[ ]
定义了一个字符类。所以你在那里设置的每个字符都将匹配。[012]
将匹配0
或1
或2
,[0-2]
的行为也是一样的。您需要的是定义OR语句的分组。请使用
(s|season)
来解决您的问题。顺便说一句,你必须小心。普通正则表达式(或分组)中的元字符与字符类是不同的。字符类就像一个子语言。
[$A]
只匹配$
或A
,没有其他内容。这里没有转义。v09wglhw5#
\bs\b|\bseason\b
s|\bseason\b