我正在尝试理解和实践以下内容。我猜(?: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"]
它们之间有什么区别吗? 谢谢
答案 0 :(得分:3)
在您的示例中,没有真正的区别,因为带有?
的正则表达式也不使用捕获组。如果将s
放置在捕获组中,将s
添加到输入字符串,并从正则表达式中删除了全局标志,那么您会看到一个区别:
let str = "seconds";
let res = str.match(/second(s)?/g);
console.log(res);
但是不,在这种情况下使用的非捕获组(?:)
与可选语句?
并没有实质差异。
答案 1 :(得分:1)
如果非捕获组(?:...)
和捕获组(...)
的内容只有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