我有一个字符串。
var string="ghtykj";
var pattern = "t*y";
当我使用 new RegExp(pattern).test(string) 时,会返回 true(正如预期的一样)。
var pattern = "t*g";
但是这个模式也返回true。
我原本期望这个模式返回false,因为t*g的意思是t后面跟着零或更多个字符,再跟着g。
如果这确实是期望的行为,有人能否纠正我哪里出错了吗?
我有一个字符串。
var string="ghtykj";
var pattern = "t*y";
var pattern = "t*g";
但是这个模式也返回true。
我原本期望这个模式返回false,因为t*g的意思是t后面跟着零或更多个字符,再跟着g。
如果这确实是期望的行为,有人能否纠正我哪里出错了吗?
*
在正则表达式中不是通配符,而是量词。它的含义与量词{0,}
相同,即指定它前面的表达式(在本例中为字符t
)可以出现零次或多次。t*g
并不意味着t后面跟着零个或多个字符,然后是g。它的意思是零个或多个字符t,后面跟一个字符g。t*g
将匹配tg
或tttttg
,但也会匹配字符串开头的g
字符。t.*g
(或t[\w\W]*g
来处理字符串中的换行符)。由于t*g表示t后面跟着零个或多个字符,然后是g。
这是不正确的。这意味着0个或多个,所以是可选的。
你可能想到了终端shell中的Globbing,其中<*>运算符将按照你的预期工作。但是,Globbing <*>与RegEx <*>具有不同的行为。
你想要的是
var pattern = "t.*g";
.
是可选的(0或多个实例),但必须有一个 t
。.
匹配几乎任何字符。您应该在此处测试您的正则表达式:regex101,它将把您的正则表达式翻译成英语,使其更易于理解。
var pattern = "t.*g";
应该是正确的。t*
表示0个或多个t,这是真实的。