【问题标题】:RegEx optional group with optional sub-group带有可选子组的 RegEx 可选组
【发布时间】:2020-02-14 14:09:40
【问题描述】:

我有一组命名相当不一致的字符串,但它们的结构应该足以分组。

摘录如下:

test test 1970-2020 w15.txt
test 1970-2020 w15.csv
test  1990-99 q1 .txt
test 1981 w15 .csv
test test  w15.csv

我正在尝试使用以下 RegEx 按组(测试名称、(年份)?、后缀、类型)提取信息:

(.*)\s+([0-9]+(\-[0-9]+)?\s+)?((w|q)[0-9]+(\s+)?)(\..*)$

除了与年份匹配的可选组(年份间隔、单年或根本没有年份)外,它都有效。 我缺少什么来使模式起作用?

这里还有一个用于测试的 RegEx101 链接:

https://regex101.com/r/wG3aM3/817

【问题讨论】:

  • 您的第一组匹配所有内容,您需要更具体,例如[^0-9]+[ a-z]+
  • 您使用什么语言/工具?来自regex tag info:“由于正则表达式尚未完全标准化,所有带有此标签的问题还应包含一个指定适用的编程语言或工具的标签。”

标签: regex


【解决方案1】:

您可以使模式更具体一些,并使年份的内容可选

^(.*?)\s+((?:\d{4}(?:-(?:\d{4}|\d{2}))?)?)\s+([wq][0-9]+)\s*(\.\w+)$

说明

  • ^ 字符串开始
  • (.*?) 捕获 group 1 匹配 0+ 次除换行符以外的任何字符,非贪婪
  • \s+ 匹配 1+ 个空格字符
  • ( 捕获第 2 组
    • (?:非捕获组
      • \d{4}(?:-(?:\d{4}|\d{2}))? 匹配 4 位数字和可选的 - 和 2 或 4 位数字
    • )?关闭非捕获组并使年份可选
  • )关闭第二组
  • \s+ 匹配 1+ 个空格字符
  • ([wq][0-9]+) 捕获 第 3 组 匹配 wq 和 1+ 位 0-9
  • \s* 匹配 0+ 个空白字符
  • (\.\w+)捕获第4组,匹配一个点和1个以上的单词字符
  • $字符串结束

Regex demo

请注意,\s 也可以匹配换行符。

【讨论】:

  • 让第一组不贪婪就成功了。年份并不总是 4 位或 2 位长,这就是我没有指定位数的原因。这是满足我需求的正则表达式,以防有人感兴趣: (.*?)\s+([0-9]+(\-[0-9]+)?)?(?:\s+)?( [wq])([0-9]+)(?:\s+)?(\..*)$
猜你喜欢
  • 2013-03-06
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 2013-01-13
  • 2011-06-08
  • 2017-01-16
相关资源
最近更新 更多