2

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

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

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

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

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

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

我究竟做错了什么?

4

4 回答 4

2

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

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

我的正则表达式和 Jonah 的主要区别在于我的包含?:意味着不捕获子组。当您在正则表达式中分组时,它会自动返回该组中的内容,除非您告诉它不要这样做,而且我发现有时当使用诸如replaceor之类的方法时这些组被捕获时split,它可能会有点错误,这可能是你的问题也是如此。

于 2012-09-05T16:52:29.330 回答
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 (blah blah)
  • 尝试另一个例子 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!");
}
于 2012-09-05T17:17:10.143 回答
1

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

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

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

于 2012-09-05T16:53:00.477 回答
0

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

于 2012-09-05T17:10:46.830 回答