正则表达式的字符串

时间:2010-10-09 15:15:25

标签: c# regex

如果有人能为我提供以下字符串的正则表达式,那将会很棒。

样本1:<div>abc</div><br>

示例2:<div>abc</div></div></div></div></div><br>

正如您在上面提供的示例中所看到的,无论发生多少</div>,我都需要匹配字符串。

如果</div><br>之间出现任何其他字符串,例如<div>abc</div></div></div>DEF</div></div><br><div>abc</div></div></div></div></div>DEF<br>,则正则表达式不匹配。< / p>

提前致谢。

5 个答案:

答案 0 :(得分:3)

试试这个:

<div>([^<]+)(?:<\/div>)*<br>

rubular

注意:

  • 仅当abc部分(或任何带有<符号的内容)中没有标记时才有效。
  • 如果您希望字符串与模式完全匹配,您可能希望使用字符串锚点的开始和结束(^<div>([^<]+)(?:<\/div>)*<br>$
  • 如果您想允许abc部分为空,请使用*代替+

话虽这么说,你应该警惕使用regex to parse HTML

在此示例中,可以使用正则表达式,因为您正在解析(希望)已知的常规HTML子集。但是,在解析HTML时,首选一个更强大的解决方案(即:[X] HTML解析器,如HtmlAgilityPack)。

答案 1 :(得分:1)

You need to use a real parser。无限嵌套标签之类的东西无法通过正则表达式来处理。

答案 2 :(得分:1)

您还可以在表达式中包含一个命名组,例如:

<div>(?<text>[^<]*)(?:<\/div>)*<br>

在C#中实现:

var regex = new Regex(@"<div>(?<text>[^<]*)(?:<\/div>)*<br>");
Func<Match, string> getGroupText = m => (m.Success && m.Groups["text"] != null) ? m.Groups["text"].Value : null;
Func<string, string> getText = s => getGroupText(regex.Match(s));

Console.WriteLine(getText("<div>abc</div><br>"));
Console.WriteLine(getText("<div>123</div></div></div></div></div><br>"));

答案 3 :(得分:0)

NullUserException的答案很好。以下是一些问题和变体,具体取决于您的需求。

你想在open div标签之前阻止任何事情发生吗?如果是这样,请将^保留在正则表达式的开头。如果没有,请放弃它。

本文的其余部分引用了正则表达式的以下部分:

([^<]+?)

您想捕获div的内容,还是只知道它与您的表单匹配?捕获,保持原样。如果您不需要捕获,请从上面删除括号。

如果div内没有任何内容,你想匹配吗?如果是这样,将上面的+改为*

最后,虽然它会正常工作,但你不需要吗?在上面。

答案 4 :(得分:0)

我认为,这个正则表达式更灵活:

  <div\b[^><]*+>(?>.*?</div>)(?:\s*+</div>)*+\s*+<br(?:\s*+/)?>

我在正则表达式的开头和结尾都没有包含^$,因为我们无法确保您的示例总是在一行中。