我正在尝试理解和练习以下内容。我想(?: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
因为?
会影响d
和s
,在这种情况下,它会给出与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