正则表达式嵌套可选组

时间:2012-09-05 16:37:17

标签: regex

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

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

  2.   
  3. '如果没有年份范围只捕获一年 2005 '

  4.   
  5. '捕获年/年范围,后跟括号,包括括号 2007-2012(58个月)'

  6.   

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

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

我做错了什么?

4 个答案:

答案 0 :(得分:2)

这个正则表达式很好用。 :)

/(?:(?:\d{4}[-–— ])?\d{4})(?: \(\d+ months\))?$/

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

答案 1 :(得分:2)

试试这个正则表达式:

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

这个捕获括号中的所有内容。 如果您需要特定于括号中“(number)months”文本的正则表达式,那么您可以使用:\d{4}(?:[-–— ]\d{4})?(?:\s+\(\d+\smonths\))?$

链接到测试:RegexPalRegExr

示例文字:

  • 在字符串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!");
}

答案 2 :(得分:1)

以下正则表达式适用于Perl脚本示例。它应该可以在JavaScript中使用:

/(\d{4}([-–— ]\d{4})?( \(\d+ months\))?)$/
  1. 我们首先匹配一个4位数的年份:\d{4}
  2. 然后我们匹配一个可选的分隔符,然后是另一个4位数的年份:([-–— ]\d{4})?
  3. 最后,我们匹配可选的月份部分:( \(\d+ months\))?
  4. 如果您的数据并不总是遵循此严格模板,则可能需要在需要的位置插入空格匹配(\s*)。

答案 3 :(得分:0)

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