如何匹配组中的一系列字符

时间:2014-07-07 01:50:03

标签: c# regex

我有这个字符串序列

game (
    name "!Mario (2000-11-19)(Dokokalaki)(JP)[h][Super Mario Bros.]"
    description "!Mario (2000-11-19)(Dokokalaki)(JP)[h][Super Mario Bros.]"
    rom ( name "!Mario (2000-11-19)(Dokokalaki)(JP)[h][Super Mario Bros.].nes" size 40976 crc 2e2bf112 md5 b1a0e41cfd30c1d61de3b7900232de59 sha1 7849ccb4cba5714042694da0e076092565023fc9 )
)

game (
    name "'89 Dennou Kyuusei Uranai (1988-12-10)(Induction Produce)(JP)"
    description "'89 Dennou Kyuusei Uranai (1988-12-10)(Induction Produce)(JP)"
    rom ( name "'89 Dennou Kyuusei Uranai (1988-12-10)(Induction Produce)(JP).nes" size 262160 crc 679db8f7 md5 31c66f47bd73568b4a675c9f8d995684 sha1 3918c52a5491695ed6b10b65f59622687dd7dc66 )
)

如果匹配给定的crc值,我想匹配rom ( name"" size之间的字符。我目前有这个正则表达式

(?<=name ")(.+)(?= crc 2e2bf112)

匹配!Mario (2000-11-19)(Dokokalaki)(JP)[h][Super Mario Bros.].nes" size 40976

我需要一个正则表达式来匹配!Mario (2000-11-19)(Dokokalaki)(JP)[h][Super Mario Bros.].nes

我尝试过添加另一个外观 (?<=name ")(.+)(?=" size)(?= crc 2e2bf112) 但这根本不匹配。除了size之外,我不知道crc之后的内容的长度或值,所以我无法将其与[0-9] s匹配

我正在使用RegExr构建我的正则表达式,正则表达式本身将用于.NET / C#代码。

2 个答案:

答案 0 :(得分:3)

使用此正则表达式:

(?<=rom \( name "").*?(?="" size \d+ crc 2e2bf112)

在C#中:

string theMatch = Regex.Match(yourString, @"(?<=rom \( name "").*?(?="" size \d+ crc 2e2bf112)").Value;

<强>解释

  • 后方(?<=rom \( name "")用作左侧的分隔符
  • .*?懒惰地将字符匹配到......
  • 前瞻(?="" size \d+ crc 2e2bf112)可以在右侧找到分隔符的点

<强>参考

答案 1 :(得分:0)

不要打扰外表,他们会使工作变得更加复杂,并且不会产生抵消效益。让正则表达式消耗尽可能多的字符串,并使用捕获组来提取您真正感兴趣的部分。

Regex r = new Regex(@"rom \( name ""(?<name>[^""]+)"" size \d+ crc 2e2bf112\b");
Match m = r.Match(subjectString);
if (m.Success) {
    resultString = m.Groups["name"].Value;
}