正则表达式问题:'seconds?' 和 'second(?:s)?' 之间的差异



我正在尝试理解和练习以下内容。我想(?:s)?s?提供相同的结果

let str = "second"; 
let res = str.match(/second(?:s)?/g);
console.log(res); //["second"]
let res = str.match(/seconds?/g);
console.log(res); //["second"]

它们之间有什么区别吗? 谢谢

在您的示例中,没有真正的区别,因为带有?的正则表达式也不使用捕获组。如果将s放在捕获组中,将s添加到输入字符串中,并从正则表达式中删除全局标志,则会看到差异:

let str = "seconds";
let res = str.match(/second(s)?/g);
console.log(res);

但是不,非捕获组(?:)与在此上下文中使用的可选语句?没有真正的区别。

非捕获组(?:...)和捕获组(...)如果其内容仅为 1 个字符,则没有任何影响,如果不使用对它的反向引用,则捕获组。

当你想将量词(?{N}{N,M}+*)的效果扩展到前面的字符,而且扩展到几个字符(组)时,你通常使用组。

例子:

secon(ds)?
secon(?:ds)?

将两者匹配

secon

seconds

因为?会影响ds,在这种情况下,它会给出与seconds?不同的结果。


组的另一个用途是当您想在组中使用替代项时:

time in (?:seconds?|hours?|minutes?) is a good example

time in second is a good example
time in seconds is a good example
time in hours is a good example
time in hour is a good example
time in minute is a good example
time in minutes is a good example

在组中将秒、小时和分钟之间的替代项放在


最后但并非最不重要的反向引用

查找第一个字符与最后一个字符相同的单词

^(w)w*1$

和输入:

aba
aaabbba
test
apple
car

前三行将匹配的位置。 演示:https://regex101.com/r/nrDCvn/1

最新更新