regex 用于匹配单词或其前缀的正则表达式

cig3rfwq  于 2022-12-14  发布在  其他
关注(0)|答案(5)|浏览(192)

我想在整个单词上匹配正则表达式。
在下面的示例中,我试图匹配sseason,但我得到的匹配项是seaon

[s|season]

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

3ks5zfa0

3ks5zfa01#

方括号用于字符类,实际上您尝试匹配以下任何一个:s|s(再次)、eas(再次)、on
使用括号代替分组:

(s|season)

或非捕获组:

(?:s|season)

注:非捕获组告诉引擎它不需要存储匹配项,而另一个组(捕获组)需要存储匹配项。对于小数据,这两种方法都有效;对于“大数据”,您可能希望首先确定是否需要匹配项。如果不需要,最好使用非捕获组来分配更多内存用于计算,而不是存储永远不需要使用的内容。

olmpazwi

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不包含。

匹配命令行上的特定单词,不带单词边界

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强制匹配字边界,请参阅:

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

\bAssert我们有一个单词边界,确保“dart“匹配,但“darty“不匹配。

g52tjvyc

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
avkwfej4

avkwfej44#

[ ]定义了一个字符类。所以你在那里设置的每个字符都将匹配。[012]将匹配012[0-2]的行为也是一样的。
您需要的是定义OR语句的分组。请使用(s|season)来解决您的问题。
顺便说一句,你必须小心。普通正则表达式(或分组)中的元字符与字符类是不同的。字符类就像一个子语言。[$A]只匹配$A,没有其他内容。这里没有转义。

v09wglhw

v09wglhw5#

  • 如果你把“s”看作一个词,我们可以这样处理,

\bs\b|\bseason\b

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

s|\bseason\b

相关问题