【问题标题】:regex to extract number and date from string正则表达式从字符串中提取数字和日期
【发布时间】:2020-06-17 15:10:21
【问题描述】:

我正在尝试从字符串中提取日期、百分比或数字。字符串可以是:

  1. 响应值10(从这里我要提取10)
  2. 响应值 10/12/2014(我想从这里提取 10/12/2014)
  3. 响应值 08/2015(我想从这里提取 08/2015)

我将正则表达式写成(?:\d{2}\/\d{4}|\d{2}(?:\/\d{2}\/\d{4})?) 正则表达式满足 12/12/2014, 10, 02/2012。

我也在尝试修改相同的正则表达式以获取 10、08/2015 和 10/10/2015,但不知道如何获取。

如何做到这一点?

【问题讨论】:

  • 您能提供一个您想要匹配的值的列表吗?您当前的正则表达式与您声称的 12/12/2014 不匹配,要匹配 12/12/2014,您需要 (\d{2})[\/](\d{2})[\/](\d{4})
  • 您可以使用交替匹配所有 3 种格式 \b(?:\d{2}\/\d{4}|\d{2}(?:\/\d{2}\/\d{4})?)\b regex101.com/r/xqApkK/1 请注意,4 位数字也匹配 9999

标签: javascript regex


【解决方案1】:

要匹配您的示例数据,您可以使用与 2 位/4 位匹配的替代,或者将 2 位与匹配 2 位和 4 位的可选部分匹配。

\b(?:\d{2}\/\d{4}|\d{2}(?:\/\d{2}\/\d{4})?)\b

说明

  • \b单词边界,防止单词char成为更大单词的一部分
  • (?:非捕获组
    • \d{2}\/\d{4}匹配2位/4位
    • |或者
    • \d{2} 匹配 2 位数字
    • (?:\/\d{2}\/\d{4})?可选匹配/2位/4位
  • )关闭群
  • \b字边界

Regex demo

注意 2 位和 4 位数字也可以匹配 99 和 9999。如果您想让匹配更具体,此页面可能会有所帮助https://www.regular-expressions.info/dates.html

const pattern = /\b(?:\d{2}\/\d{4}|\d{2}(?:\/\d{2}\/\d{4})?)\b/;
[
  "the response value 10",
  "the response value 10/12/2014",
  "the response value 08/2015"
].forEach(s => console.log(s.match(pattern)[0]));

【讨论】:

  • 我在想,\b(?:(?:\d\d\/){1,2}\d{4}|\d\d)\b 会是一个不错的选择吗?你对此有何看法?我对正则表达式还不够熟悉,无法分辨嵌套非捕获组的性能差异。
  • @JvdV 更短:-)
  • 如果是这样,请随意使用它。否则我会把它作为替代品发布。我还在某处读到\d\d 在性能上会击败\d{2}。你对此有何看法?不知道这是否是我应该问你这些事情的地方。但我觉得这很有趣 =)
  • @JvdV 从我的脑海中我不知道。引擎还可以预先优化模式,因此步数并不总是性能保证。大多数时候,我会查看数据,并检查最少的工作量,因此如果您事先知道不会匹配,请不要触发引擎。这个页面有一些关于优化的有趣信息rexegg.com/regex-optimizations.html 恕我直言,Mastering Regular Expressions 第 4 - 6 章包含了很好的信息。
  • 我也相信步骤是唯一的基准(它们很有用,但并非总是如此)。 This 帖子可能有用。
【解决方案2】:

只是为了好玩(正则表达式很有趣)替代接受的答案:

\b(?:(?:\d\d\/){1,2}\d{4}|\d\d)\b

Online Demo

  • \b - 匹配单词边界。
  • (?: - 第一个非捕获组。
    • (?: - 第二个非捕获组。
      • \d\d\/ - 匹配两个数字和正斜杠。
      • ){1,2} - 关闭第二个非捕获组并使用一次或两次。
    • \d{4} - 匹配四位数字。
    • | - 交替 (OR)。
    • \d\d) - 两位数并关闭第一个非捕获组。
  • \b - 匹配单词边界。


也许我们可以不用轮换来做到这一点:

\b\d\d(?:(?:\/\d\d){1,2}\d\d)?\b

Online Demo

  • \b - 匹配单词边界。
  • \d\d - 匹配两个数字。
  • (?: - 第一个非捕获组。
    • (?: - 第二个非捕获组。
      • \/\d\d - 匹配一个斜线和两个数字。
      • ){1,2} - 关闭第二个非捕获组并使用一次或两次。
    • \d\d - 匹配两个数字。
    • )? - 关闭第一个非捕获组并将其设为可选。
  • \b - 匹配单词边界。

【讨论】:

    【解决方案3】:

    Match 方法支持正则表达式,并将返回一个包含您要查找的项目的数组:

    var date = "12/12/2014"
    
    	var arr = date.match(/(\d{2})[\/](\d{2})[\/](\d{4})/);
    
    	console.log(arr[0]);
    	console.log(arr[1]);
    	console.log(arr[2]);
    	console.log(arr[3]);

    【讨论】:

      猜你喜欢
      • 2016-02-28
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多