如何指定只使用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>
。然后对其余的比赛做同样的事情。
答案 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();