3

我有一些格式不正确的 html,有时缺少 "。此外,它有时显示大写字母,而有时显示小写字母:

<DIV class="main">
    <DIV class="subsection1">
   <H2>
   <DIV class=subwithoutquote>StackOverflow</DIV></H2></DIV></DIV>

我想同时匹配多行并忽略大小写。但是以下模式似乎不起作用。(对于连接,我也尝试了 | 而不是 &)

const string pattern = @"<div class=""?main""?><div class=""?subsection1""?><h2><div class=""?subwithoutquote""?>(.+?)</div>";
Match m = Regex.Match(html, pattern, RegexOptions.IgnoreCase & RegexOptions.Singleline);

或者我应该在模式中添加 \n* 来解决多行问题?

4

2 回答 2

7

第一个问题是您不允许选项卡之间的正则表达式中有空格。正确的正则表达式(在 Rubular 中测试)是:

<div class=""?main""?>\s*<div class=""?subsection1""?>\s*<h2>\s*<div class=\"?subwithoutquote\"?>(.+?)<\/div>\s*

注意添加了几个\s*条目。

第二个问题是您没有正确连接选项。

你的代码:

Match m = Regex.Match(html, pattern, RegexOptions.IgnoreCase & RegexOptions.Singleline);

由于这些是位标志,因此按位与(&运算符)是错误标志。你想要的是按位或(|运算符)。

Bitwise-And 表示“如果在这两个中都设置了位,则将其设置;否则,取消设置。您需要 Bitwise-Or,这意味着“如果在其中任何一个中设置了位,则设置它;否则,取消设置。”

于 2013-01-30T18:51:20.440 回答
3

在这种情况下,您需要将它们组合在一起。

const string pattern = @"<div class=""?main""?><div class=""?subsection1""?><h2><div class=""?subwithoutquote""?>(.+?)</div>";
Match m = Regex.Match(html, pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline)

编辑:将您的正则表达式更改为以下...

const string pattern = @"<div class="?main"?>\s*<div class="?subsection1"?>\*+<h2>\s*<div class="?subwithoutquote"?>(.+?)</div>
于 2013-01-30T18:52:11.673 回答