首页 > 解决方案 > 匹配 javascript 中的正则表达式

问题描述

我试图从以下字符串中提取日期,但无济于事。

const strs = [
    `X
       March 17th 2011
`,
    `X
       2011
`,
    `X
    March
       2011
`,
];

console.log(strs.map(s => 
  s.match(/X\s+([a-zA-Z]+?\s*[a-zA-Z0-9]+)?\s*(\d+)/))
);

问题在于第一场比赛,目前是

[
    "X\n       March 17",
    "March",
    "17"
]

虽然它应该是

[
    "X\n           March 17th 2011",
    "March",
    "17th",
    "2011"
]

任何帮助,将不胜感激。

标签: javascriptregex

解决方案


您可以使用

/X(?:\s+([a-zA-Z]+))?(?:\s+([a-zA-Z0-9]+))?\s+(\d+)/g

请参阅正则表达式演示详情

  • X- 一个X字符
  • (?:\s+([a-zA-Z]+))?- 一个或多个空格 ( \s+) 和一个或多个 ASCII 字母的可选序列(捕获到第 1 组)
  • (?:\s+([a-zA-Z0-9]+))?- 一个或多个空格 ( \s+) 和一个或多个 ASCII 字母或数字的可选序列(捕获到第 2 组)
  • \s+- 1+ 个空格
  • (\d+)- 第 3 组:一位或多位数字

请参阅下面的 JavaScript 演示:

const strs = ["X\n           March 17th 2011\n", "X\n           2011\n", "X\n        March\n           2011\n"];
const rx = /X(?:\s+([a-zA-Z]+))?(?:\s+([a-zA-Z0-9]+))?\s+(\d+)/;
strs.forEach(s => 
  console.log( s.match(rx) )
);

或者,获取完整值:

const strs = ["X\n           March 17th 2011\n", "X\n           2011\n", "X\n        March\n           2011\n"];
const rx = /X(?:\s+[a-zA-Z]+)?(?:\s+[a-zA-Z0-9]+)?\s+\d+/g;
strs.forEach(s => 
  console.log( s.match(rx).map(x => x.substr(1).trim().replace(/\s+/g, ' ') ))
);


推荐阅读