2012-09-05 122 views
1

我试图捕捉字符串这样大胆部分:正则表达式嵌套可选组

  1. “捕捉在字符串的结尾年份范围1995-2010

  2. '如果没有年份范围只是捕获单一年份'

  3. '捕获年份/年份范围一个括号,包括括号2007-2012(58个月)'

此正则表达式适用于1和2,但我不能让它为3工作:

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

我做错了什么?

+0

您的字符串是否总是包含在'''中?我的意思是,是否是字符串的一部分? – Aust

+0

你正在使用什么特定的正则表达式工具? – Glenn

+0

@如果'''不是字符串的一部分。 @Glenn我在javascript'.replace()'的上下文中使用它。 – supertrue

回答

2

试试这个正则表达式:括号

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

这一次抓住了一切。 如果您需要在括号中的正则表达式的具体文本“(数量)个月”,那么你可以使用这个:\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!"); 
} 
+0

感谢您的回答和解释。这就是我喜欢SO的原因。 – supertrue

2

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

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

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

+0

这一个似乎不匹配1和2. – Kash

+0

@卡什 - 感谢哈哈它现在的作品。当我复制它时,我错误地输入了最后一个“?” – Aust

+0

谢谢,这也适用 - 希望我可以选择多个答案。 – supertrue

1

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

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

您可能需要插入空白匹配(\s*)在需要的地方,如果你的数据不ALW ays遵循这个严格的模板。

+0

年份范围可以有以下分隔符之一:[---]由OP的正则表达式提供。这个不包括那个。 – Kash

+0

糟糕...你是对的!我会修改它... –

0

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