我有一组命名相当不一致的字符串,但它们的结构应该足以分为几组。
这是摘录:
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 链接:
您可以使模式更具体一些,并将当年的内容设为可选
^(.*?)\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匹配w或q以及 1+ 数字 0-9\s*匹配 0+ 空白字符(\.\w+)捕获第4组,匹配一个点和1个以上单词字符$字符串结尾请注意,\s也可以匹配换行符。