具有可选子组的正则表达式可选组

  • 本文关键字:正则表达式 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

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

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

除了与年份匹配的可选组(年份间隔、单年或根本没有年份(之外,它仍然有效。 我缺少什么才能使模式工作?

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

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

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

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

解释

  • ^字符串开头
  • (.*?)捕获组 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也可以匹配换行符。

最新更新