正则表达式问题:“秒”之间的差异?和“ second(?:s)?”

时间:2019-06-19 06:12:40

标签: javascript regex string

我正在尝试理解和实践以下内容。我猜(?: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"]

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

2 个答案:

答案 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

因为?将同时影响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