我想检查输入字符串是否遵循模式,以及它是否从中提取信息。
我的模式就像这样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
之后的两个字符,这将很棒。
答案 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]\)$
中,您正在捕获组中捕获Episode
和Season
,但您实际想要捕获的是数字。您可以像这样切换捕获组:
^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+
。
\s
与whitespace 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