我试图捕捉这样的字符串的粗体部分:
'捕获字符串末尾的年份范围1995-2010 '
'如果没有年份范围,只需捕获单年 2005 '
'捕获后跟括号的年/年范围,包括括号2007-2012(58 个月) '
此正则表达式适用于 1 和 2,但我无法让它适用于 3:
/(\d+([-–— ]\d+( \(\d+ months\))?)?$)/
我究竟做错了什么?
我试图捕捉这样的字符串的粗体部分:
'捕获字符串末尾的年份范围1995-2010 '
'如果没有年份范围,只需捕获单年 2005 '
'捕获后跟括号的年/年范围,包括括号2007-2012(58 个月) '
此正则表达式适用于 1 和 2,但我无法让它适用于 3:
/(\d+([-–— ]\d+( \(\d+ months\))?)?$)/
我究竟做错了什么?
这个正则表达式工作得很好。:)
/(?:(?:\d{4}[-–— ])?\d{4})(?: \(\d+ months\))?$/
我的正则表达式和 Jonah 的主要区别在于我的包含?:
意味着不捕获子组。当您在正则表达式中分组时,它会自动返回该组中的内容,除非您告诉它不要这样做,而且我发现有时当使用诸如replace
or之类的方法时这些组被捕获时split
,它可能会有点错误,这可能是你的问题也是如此。
试试这个正则表达式:
/\d{4}(?:[-–— ]\d{4})?(?:\s*\([^)]+\))?$/gm
这个捕获了括号中的所有内容。如果您需要特定于括号中文本“(数字)个月”的正则表达式,那么您可以使用它:\d{4}(?:[-–— ]\d{4})?(?:\s+\(\d+\smonths\))?$
示例文本:
和 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!");
}
以下正则表达式在示例 Perl 脚本中适用于我。它应该可以在 JavaScript 中使用:
/(\d{4}([-–— ]\d{4})?( \(\d+ months\))?)$/
\d{4}
([-–— ]\d{4})?
( \(\d+ months\))?
\s*
如果您的数据并不总是遵循这个严格的模板,您可能需要在需要的地方插入空格匹配 ( )。
如果我正确理解您的需求,它实际上在这里工作正常:Gskinner RegExr 只是交替哪个句子是最后一个,因为 $ 不会计算换行符,只是字符串的结尾。