我有以下字符串作为来自不同供应商的文件名。
9780307967121_UA_01_001_r1_128kbps.mp3
9780307967121_001.mp3
001_9780307967121.mp3
XX_9780307967121.mp3
WHERE:
9780307967121 ISBN 001是 TrackNumber
目前我正在使用分割功能来提取ISBN和TrackNumber。 TrackNumber有时可能为NULL(最后一个示例)。我打算做的是在数据库中为每个供应商定义正则表达式,并根据所选供应商的正则表达式处理文件名。
如何编写返回ISBN和TrackNumber的正则表达式,并且当文件名中没有ISBN或TrackNumber时,还必须返回null?
我实际上已经尝试构建正则表达式,如下所示
(\d{13})\w(\d{3})
但只捕获一种模式。
string pattern = @"(?:(?<ISBN>\d{10,13})|(?<TrackNumber>\d{3}))[^a-zA-Z]";
string input = "9780307967121_UA_01_001_r1_128kbps.mp3";
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection matches = rgx.Matches(input);
if (matches.Count > 0)
{
Console.WriteLine("{0} ({1} matches):", input, matches.Count);
foreach (Match match in matches)
Console.WriteLine(" " + match.Value);
}
答案 0 :(得分:1)
试试这个
<enter>
输入
(\d{10,13}).*?_(\d{3})|(\d{3}).*?_(\d{10,13})|(\d{10,13})(?=[^\d])
输出:
9780307967121_UA_01_001_r1_128kbps.mp3
9780307967121_001.mp3
001_9780307967121.mp3
XX_9780307967121.mp3
或者
MATCH 1
1. [0-13] `9780307967121`
2. [20-23] `001`
MATCH 2
1. [40-53] `9780307967121`
2. [54-57] `001`
MATCH 3
3. [63-66] `001`
4. [67-80] `9780307967121`
MATCH 4
5. [89-102] `9780307967121`
输出:
(?:(?<ISBN>\d{10,13})|(?<TrackNumber>\d{3}))[^a-zA-Z]
说明:
MATCH 1
ISBN [0-13] `9780307967121`
MATCH 2
TrackNumber [20-23] `001`
MATCH 3
ISBN [40-53] `9780307967121`
MATCH 4
TrackNumber [54-57] `001`
MATCH 5
TrackNumber [63-66] `001`
MATCH 6
ISBN [67-80] `9780307967121`
MATCH 7
ISBN [89-102] `9780307967121`
匹配数字[0-9]。量词:{10,13} 10到13次之间
\d{10,13}
匹配a-z或A-A中不存在的单个字符
答案 1 :(得分:1)
这很简洁
(?|([0-9]{13})|([0-9]{3}))[^k]
参数:
9780307967121_UA_01_001_r1_128kbps.mp3
9780307967121_001.mp3
001_9780307967121.mp3
XX_9780307967121.mp3
返回:
MATCH 1
1. [0-13] `9780307967121`
2. [20-23] `001`
MATCH 2
1. [40-53] `9780307967121`
2. [54-57] `001`
MATCH 3
1. [63-66] `001`
2. [67-80] `9780307967121`
MATCH 4
1. [89-102] `9780307967121`