如何指定仅匹配第一次出现?

时间:2010-04-13 16:11:34

标签: c# regex

如何指定只使用Regex方法匹配C#中第一次出现的正则表达式?

以下是一个例子:

string text = @"<link href=""/_layouts/OracleBI/OracleBridge.ashx?RedirectURL=res/sk_oracle10/b_mozilla_4/common.css"" type=""text/css"" rel=""stylesheet""></link></link>";
string pattern = @"(<link).+(link>)";
Regex myRegex = new Regex(pattern, RegexOptions.IgnoreCase);

Match m = myRegex.Match(text);   // m is the first match
while (m.Success)
{
    // Do something with m
    Console.Write(m.Value + "\n");
    m = m.NextMatch();              // more matches
}
Console.Read();

我希望这只能替换第一个<\link>。然后对其余的比赛做同样的事情。

6 个答案:

答案 0 :(得分:32)

Regex.Match(myString)会返回找到的第一个匹配项。

对来自NextMatch()的结果对象的Match()的后续调用将继续匹配下一次出现的事件(如果有)。

例如:

  string text = "my string to match";
  string pattern = @"(\w+)\s+";
  Regex myRegex = new Regex(pattern, RegexOptions.IgnoreCase);

  Match m = myRegex.Match(text);   // m is the first match
  while (m.Success)
  {
       // Do something with m

       m = m.NextMatch();              // more matches
  }

<小时/> 编辑:如果您正在解析HTML,我会认真考虑使用HTML Agility Pack。你会为自己省去许多令人头疼的问题。

答案 1 :(得分:29)

我相信你只需要在第一个例子中添加一个惰性限定符。每当外卡“吃太多”时,你需要在外卡上使用懒惰的限定符,或者在更复杂的情况下,向前看。在顶部添加一个惰性限定符(.+?代替.+),你应该很好。

答案 2 :(得分:3)

string text = @"<link href=""/_layouts/OracleBI/OracleBridge.ashx?RedirectURL=res/sk_oracle10/b_mozilla_4/common.css"" type=""text/css"" rel=""stylesheet""></link></link>"; 
string pattern = @"(<link).+(link>)"; 
//Regex myRegex = new Regex(pattern, RegexOptions.IgnoreCase); 
//Match m = myRegex.Match(text);   // m is the first match
Match m = Regex.Match(text, pattern, RegexOptions.IgnoreCase);
/*while (m.Success)         
{             
    // Do something with m             
    Console.Write(m.Value + "\n");             
    m = m.NextMatch();              // more matches         
}*/
// use if statement; you only need 1st match
if (m.Success)
{
    // Do something with m.Value
    // m.Index indicates its starting location in text
    // m.Length is the length of m.Value
    // using m.Index and m.Length allows for easy string replacement and manipulation of text
}
Console.Read();

答案 3 :(得分:0)

将分组与RegExOptions.ExplicitCapture结合使用。

答案 4 :(得分:0)

可能有点过于简化,但是如果你收到一些匹配并希望第一次出现,你可以查看Match.Index属性以找到最低的索引。

这是MSDN documentation就可以了。

如果这只是一个范围问题,那么我同意Rich's comment - 你需要使用非贪婪的修饰语来阻止你的表达过度“吃”。

答案 5 :(得分:0)

试试这个

string text = @"<link href=""/_layouts/OracleBI/OracleBridge.ashx?RedirectURL=res/sk_oracle10/b_mozilla_4/common.css"" type=""text/css"" rel=""stylesheet"">      </link></link>";
string pattern = @"(<link).+(link>)";
Regex myRegex = new Regex(pattern, RegexOptions.IgnoreCase);


MatchCollection matches = myRegex.Matches(text);
        foreach (Match m in matches) {
            Console.Write(m.Value + "\n");
        }
Console.Read();