如果有人能为我提供以下字符串的正则表达式,那将会很棒。
样本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>
提前致谢。
答案 0 :(得分:3)
试试这个:
<div>([^<]+)(?:<\/div>)*<br>
注意:
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*+/)?>
我在正则表达式的开头和结尾都没有包含^
和$
,因为我们无法确保您的示例总是在一行中。