我试图像这样捕获字符串的粗体部分:
"在字符串末尾捕获 1995-2010 年的年份范围">
"如果没有年份范围,只需捕获单个年份2005">
"捕获年份/年份范围,后跟括号,包括括号 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))?$/
我的正则表达式和约拿的正则表达式之间的主要区别在于我的正则表达式包含?:
这意味着不捕获子组。当您在正则表达式中分组时,它会自动返回该组中的内容,除非您告诉它不要这样做,而且我发现有时当这些组在使用replace
或split
等方法时被捕获时,它可能是一个小问题,也可能是你的问题。
以下正则表达式在示例Perl脚本中对我有用。它应该在 JavaScript 中是可行的:
/(d{4}([-–— ]d{4})?( (d+ months))?)$/
- 我们首先匹配一个 4 位数的年份:
d{4}
- 然后我们匹配一个可选的分隔符,后跟另一个 4 位数的年份:
([-–— ]d{4})?
- 最后,我们匹配可选的月份部分:
( (d+ months))?
如果您的数据并不总是遵循此严格模板,则可能需要在需要时插入空格匹配项 ( s*
(。
如果我正确理解您的需求,它实际上在这里工作正常: Gskinner RegExr只需交替哪个句子是最后一个句子,因为 $ 不计入换行符,只计算字符串的末尾。