正则表达ISBN和atrack数

时间:2016-03-18 01:30:43

标签: c# regex

我有以下字符串作为来自不同供应商的文件名。

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})

但只捕获一种模式。

C#代码

           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);
            }

2 个答案:

答案 0 :(得分:1)

试试这个

<enter>

Demo

输入

(\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`

Demo

输出:

(?:(?<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]

Regex101:

参数:

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`