正则表达式可选组和可选子组

oep*_*pix 0 regex

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

这是摘录:

test test 1970-2020 w15.txt
test 1970-2020 w15.csv
test  1990-99 q1 .txt
test 1981 w15 .csv
test test  w15.csv
Run Code Online (Sandbox Code Playgroud)

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

(.*)\s+([0-9]+(\-[0-9]+)?\s+)?((w|q)[0-9]+(\s+)?)(\..*)$
Run Code Online (Sandbox Code Playgroud)

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

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

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

The*_*ird 5

您可以使模式更具体一些,并将当年的内容设为可选

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

解释

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

正则表达式演示

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