如果字符串格式匹配,则提取数字

时间:2018-03-16 15:24:13

标签: c# regex

我想检查输入字符串是否遵循模式,以及它是否从中提取信息。

我的模式就像这样Episode 000 (Season 00)。 00是数字,范围从0到9。现在我想检查此输入Episode 094 (Season 02)是否与此模式匹配,因为它确实应该提取这两个数字,所以我最终得到两个整数变量94& 2

string latestFile = "Episode 094 (Season 02)";
if (!Regex.IsMatch(latestFile, @"^(Episode)\s[0-9][0-9][0-9]\s\((Season)\s[0-9][0-9]\)$"))
    return

int Episode = Int32.Parse(Regex.Match(latestFile, @"\d+").Value);
int Season = Int32.Parse(Regex.Match(latestFile, @"\d+").Value);

我检查整个字符串是否与模式匹配的第一部分,但我认为可以改进。对于第二部分,我实际提取的数字我被卡住了,上面发布的内容显然不起作用,因为它抓取了字符串中的所有数字。所以,如果你们中的任何人可以帮我弄清楚如何只提取Episode之后的三个数字字符以及Season之后的两个字符,这将很棒。

2 个答案:

答案 0 :(得分:3)

^Episode (\d{1,3}) \(Season (\d{1,2})\)$

捕获2个数字(即使长度为1到3/2)并将其作为一组返回。 您可以更进一步,为您的小组命名:

^Episode (?<episode>\d{1,3}) \(Season (?<season>\d{1,2})\)$

然后给他们打电话。

使用群组的示例:

string pattern = @"abc(?<firstGroup>\d{1,3})abc";
string input = "abc234abc";
Regex rgx = new Regex(pattern);
Match match = rgx.Match(input);
string result = match.Groups["firstGroup"].Value; //=> 234

您可以看到表达式的含义并测试它们here

答案 1 :(得分:2)

在正则表达式^(Episode)\s[0-9][0-9][0-9]\s\((Season)\s[0-9][0-9]\)$中,您正在捕获组中捕获EpisodeSeason,但您实际想要捕获的是数字。您可以像这样切换捕获组:

^Episode\s([0-9][0-9][0-9])\s\(Season\s([0-9][0-9])\)$

以这种方式匹配3位数[0-9][0-9][0-9]可以写为\d{3}[0-9][0-9]可以写为\d{2}

这看起来像^Episode\s(\d{3})\s\(Season\s(\d{2})\)$

要匹配一个或多个数字,您可以使用\d+

\swhitespace character匹配。您可以使用\s或空格。

你的正则表达式可能如下:

^Episode (\d{3}) \(Season (\d{2})\)$

string latestFile = "Episode 094 (Season 02)";
GroupCollection groups = Regex.Match(latestFile, @"^Episode (\d{3}) \(Season (\d{2})\)$").Groups;
int Episode = Int32.Parse(groups[1].Value);
int Season = Int32.Parse(groups[2].Value);
Console.WriteLine(Episode);
Console.WriteLine(Season);

这将导致:

94
2

Demo C#