正则表达式嵌套的可选组



我试图像这样捕获字符串的粗体部分:

  1. "在字符串末尾捕获 1995-2010 年的年份范围">

  2. "如果没有年份范围,只需捕获单个年份2005">

  3. "捕获年份/年份范围,后跟括号,包括括号 2007-2012(58 个月(">

这个正则表达式适用于 1 和 2,但我无法让它适用于 3:

/(d+([-–— ]d+( (d+ months))?)?$)/

我做错了什么?

试试这个正则表达式:

/d{4}(?:[-–— ]d{4})?(?:s*([^)]+))?$/gm

这个捕获了括号中的所有内容。如果您需要特定于括号中的文本"(数字(月"的正则表达式,则可以使用以下内容:d{4}(?:[-–— ]d{4})?(?:s+(d+smonths))?$

测试链接:RegexPal 或 RegExr

示例文本:

  • 捕获字符串末尾的年份范围 1995-2010
  • 如果没有年份范围,只需捕获单个年份 2005
  • 捕获年份/年份范围,后跟括号,包括括号 2007-2012 (58个月(
  • 尝试另一个例子 1990 (23 周(
  • 尝试另一个示例 1995-2002 (X 天(
  • 尝试另一个示例 2050 (等等(
  • 尝试另一个示例 2050—3000
  • 尝试另一个示例 2050-3000
  • 尝试另一个示例 2050–3000

还有 JavaScript 代码:

var regex = /d{4}(?:[-–— ]d{4})?(?:s*([^)]+))?$/gm; //multiline enabled
var input = "your input string"; 
if(regex.test(input)) {
  var matches = input.match(regex);
  for(var match in matches) {
    alert(matches[match]);
  } 
} else {
  alert("No matches found!");
}

这个正则表达式工作得很好。 :)

/(?:(?:d{4}[-–— ])?d{4})(?: (d+ months))?$/
我的正则表达式

和约拿的正则表达式之间的主要区别在于我的正则表达式包含?:这意味着不捕获子组。当您在正则表达式中分组时,它会自动返回该组中的内容,除非您告诉它不要这样做,而且我发现有时当这些组在使用replacesplit等方法时被捕获时,它可能是一个小问题,也可能是你的问题。

以下正则表达式在示例Perl脚本中对我有用。它应该在 JavaScript 中是可行的:

/(d{4}([-–— ]d{4})?( (d+ months))?)$/
  1. 我们首先匹配一个 4 位数的年份:d{4}
  2. 然后我们匹配一个可选的分隔符,后跟另一个 4 位数的年份:([-–— ]d{4})?
  3. 最后,我们匹配可选的月份部分:( (d+ months))?

如果您的数据并不总是遵循此严格模板,则可能需要在需要时插入空格匹配项 ( s* (。

如果我正确理解您的需求,它实际上在这里工作正常: Gskinner RegExr只需交替哪个句子是最后一个句子,因为 $ 不计入换行符,只计算字符串的末尾。

最新更新