正则表达式选项:匹配多行并忽略大小写。

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*来解决多行问题吗?

我已经编辑了你的标题。请参考“问题的标题应该包含“标签”吗?”,在那里达成共识是“不应该”。 - John Saunders
你尝试过使用HTML解析器吗? - svick
请参见 https://dev59.com/X3I-5IYBdhLWcg3wq6do。 - abatishchev
1
你的正则表达式失败了,因为你没有允许标签之间的自由空格\s+ - nhahtdh
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);

由于这些是位标志,按位与(&运算符)是错误的标志。你需要的是按位或(|运算符)。
按位与意味着“如果在这两个中都设置了该位,则保留该位设置;否则,取消设置。你需要按位或,它意味着“如果在任一一个中设置了该位,则设置它;否则,取消设置。”

我编辑了我的原始帖子。 我尝试过&和|,但都不起作用。 - Yang
@Yang 我已经更新并纠正了正则表达式中空格的遗漏,这样问题就解决了。 - ashes999

3
在这种情况下,您需要将它们进行逻辑或(OR)运算。
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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接