Javascript RegExp中的“*”未按预期工作

5

我有一个字符串。

var string="ghtykj";
var pattern = "t*y";

当我使用 new RegExp(pattern).test(string) 时,会返回 true(正如预期的一样)。
var pattern = "t*g";

但是这个模式也返回true。

我原本期望这个模式返回false,因为t*g的意思是t后面跟着零或更多个字符,再跟着g。

如果这确实是期望的行为,有人能否纠正我哪里出错了吗?


你似乎将正则表达式和Glob混淆了:http://en.wikipedia.org/wiki/Glob_%28programming%29 - Felix Kling
4个回答

8
*在正则表达式中不是通配符,而是量词。它的含义与量词{0,}相同,即指定它前面的表达式(在本例中为字符t)可以出现零次或多次。
模式t*g并不意味着t后面跟着零个或多个字符,然后是g。它的意思是零个或多个字符t,后面跟一个字符g。
例如,模式t*g将匹配tgtttttg,但也会匹配字符串开头的g字符。
要获得匹配t后面跟着零个或多个字符,然后是g的模式,您应该使用t.*g(或t[\w\W]*g来处理字符串中的换行符)。

6

由于t*g表示t后面跟着零个或多个字符,然后是g。

这是不正确的。这意味着0个或多个,所以是可选的。

你可能想到了终端shell中的Globbing,其中<*>运算符将按照你的预期工作。但是,Globbing <*>与RegEx <*>具有不同的行为。

你想要的是

var pattern = "t.*g";

这意味着 . 是可选的(0或多个实例),但必须有一个 t
在正则表达式中,.匹配几乎任何字符

3

您应该在此处测试您的正则表达式:regex101,它将把您的正则表达式翻译成英语,使其更易于理解。


1
听起来像是一条注释,但没问题。 - user4227915
我无法添加评论,因为我的声望值较低。 - Zapp
1
所以我会帮你增加10个声望值.. =) - user4227915

1
var pattern = "t.*g";

应该是正确的。t*表示0个或多个t,这是真实的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接