我有一组命名相当不一致的字符串,这些字符串的结构应该足以分成几组。
以下为摘录:
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匹配w
或q
和 1+ 数字 0-9s*
匹配 0+ 空格字符(.w+)
捕获组 4,匹配一个点和 1+ 个单词字符$
字符串结尾
正则表达式演示
请注意,s
也可以匹配换行符。