我正在.NET项目中使用正则表达式来获取特定标记。 我想匹配整个DIV标签及其内容:

<html>
   <head><title>Test</title></head>
   <body>
     <p>The first paragraph.</p>
     <div id='super_special'>
        <p>The Store paragraph</p>
     </div>
     </body>
  </head>

码:

    Regex re = new Regex("(<div id='super_special'>.*?</div>)", RegexOptions.Multiline);


    if (re.IsMatch(test))
        Console.WriteLine("it matches");
    else
        Console.WriteLine("no match");

我想要匹配这个:

<div id="super_special">
   <p>Anything could go in here...doesn't matter.  Let's get it all</p>
</div>

我想. 应该得到所有的角色,但它似乎有回车的麻烦。 我的正则表达式遗失了什么?

谢谢。

===============>>#1 票数:6

拜托,拜托,帮自己一个大忙 :使用HTML解析器解析HTML。 认真。 这就是他们的目的。

HTML是一种非常复杂的语言。 无论你将多长时间调整,摆弄,修复,磨练你的Regexp, 总会有一个你想念的案例。

无论如何,你必须告诉你的Regexp引擎匹配多行,而不只是一行。 在一些最流行的应用中,您可以通过应用/m修饰符来实现。

但请允许我再说一遍: 使用HTML解析器。 每当有人使用正则表达式解析HTML时,小猫就会死...

===============>>#2 票数:1

取决于您正在使用的语言。例如,在perl中,您将使用正则表达式修饰符:

m{<div id="super_special">.*?</span>}s

===============>>#3 票数:1

你用的是什么语言? 在.NET中,您必须设置一个选项以确保它不是单行。

===============>>#4 票数:1

取决于语言。 如果在python上,你缺少re.S标志,就像这样(删除匹配):

re.compile('<div id="super_special">.*?</div>',re.S).sub(your_html,'')

其他正则表达式实现存在类似的标志,它们被称为“单行”或“多行”或类似的东西。

不要使用REGEXPS PARSE HTML 这是维护地狱的直接途径。 使用像Beautiful Soup这样的HTML解析器。 检查这些 链接以获取该方向的有用资源。

===============>>#5 票数:1

问题是,。 默认情况下,元字符与换行符不匹配。 您必须使用单行修改器来实现此目的。 在.NET中,您可以使用RegexOptions.SingleLine作为您正在使用的方法的最后一个参数,或者直接在模式中使用修饰符,例如:

(?s)(<div id="super_special">.*?</div>)

===============>>#6 票数:1

大多数语言都有一些方法可以制作。 匹配换行符:

  • 在Java中:Pattern.compile(“pattern”,Pattern.MULTILINE);
  • 在Perl和Ruby中:/ pattern / m
  • 在VB中:Regex.IsMatch(s,“pattern”,RegexOptions.Multiline)

一般来说,使用regexp来匹配XML / HTML并不是一个好主意,因为XML / HTML标签可以嵌套,例如:

  <div id="super_special">
     <div>Nothing</div>
     <p>Anything could go in here...doesn't matter.  Let's get it all</p>
  </div>

...在这里你很容易最终匹配:

  <div id="super_special">
     <div>Nothing</div>

另一方面,如果你确定你所匹配的HTML总是对你的正则表达式是安全的,那么不要让我阻止你(尽管如此,你应该三思而后行,从潜在的调试中保存你未来的自我头痛)。

===============>>#7 票数:1 已采纳

开箱即用,没有特殊修饰符,大多数正则表达式实现不会超出行尾以匹配文本。 您可能应该查看正在使用此类修饰符的正则表达式引擎的文档。

我有另外一个建议:提防贪婪! 传统上,正则表达式贪婪的,这意味着你的正则表达式可能会匹配这个:

<div id="super_special">
  I'm the wanted div!
</div>
<div id="not_special">
  I'm not wanted, but I've been caught too :(
</div>

你应该检查一个“非贪婪”的修饰符,这样你的正则表达式会在第一次出现</div>停止匹配文本,而不是在最后一次出现时。

此外,正如其他人所说,考虑使用HTML解析器而不是正则表达式。 它会为你省去很多麻烦。

编辑:如果<div> s嵌套,即使非贪婪的正则表达也不会按预期工作! 考虑使用HTML解析器的另一个原因。

===============>>#8 票数:0

单独的正则表达式根本不足以解决您的问题。 你需要更强大的东西,比如无上下文的语法。 请参阅Wikipedia上的Chomsky层次结构

换句话说(如前所述),不要使用正则表达式来解析HTML。

===============>>#9 票数:0

(点)匹配除换行符\\ r和\\ n之外的任何单个字符。 大多数正则表达式都可以选择使点匹配行中断字符。 匹配x或(几乎)任何其他字符

===============>>#10 票数:0

也许: 。 [\\ r \\ n] [\\ r \\ n]的

===============>>#11 票数:0

这些正则表达式建议都不起作用。 根据它们是否贪婪,它们将匹配文档中的最后一个</ div>,或者匹配起始字符串后面的第一个</ div>,它可能是一个嵌套在您的文本中的div。有兴趣。

正则表达式实际上不是用于此目的的理想工具,但是如果您的情况很简单以至于您不想真正解析HTML,则可以使用.NET专有的Microsoft专有扩展来实现此目的。 有关一个很好的解释,请参阅Morten Maate撰写的这篇精彩文章

  ask by Bullines translate from so

未解决问题?本站智能推荐:

2回复

正则表达式,用于在HTML中查找特定标签[重复]

这个问题已经在这里有了答案: 如何使用HTML Agility Pack 7答案 我有一堆HTML,但我不知道要尝试在特定标记中查找和替换特定属性的值的任何信息。 因此,我想捕获具有我的匹配属性的整个标签。 标签中也可以有任意数量的未知属性。 假设我有以下HT
1回复

正则表达式可从C#.net中特定情况的锚定标记中找到href

我有些正则表达式不适合的特定情况。 例子 我从这里使用了正则表达式 我的正则表达式如下 所以1和2可以正常工作,但是3可以给 我也想知道如何匹配第一个匹配项,即如何匹配第一个双引号(“),单引号(')或空格
4回复

正则表达式“或”表达式

这可能是一个非常基本的问题,但我找不到任何答案。 我需要将一个字符串匹配两个或多个空格或等号。 当我分割此字符串时: 9 x 13 = (8.9 x 13.4) (89 x 134)与( +)我得到: 当我用(=)分割时,我得到: 如何将两者分开? 类似于: (=)OR
2回复

或正则表达式

我正在使用此(?<=^.*?;).*表达式来逐一解析用户ID。 之所以有效,是因为它们被分隔; 但是当到达最后一个没有的人时失败; 在他/她的身份证末尾。 要获得下一个ID,我使用^.*?; 一切都很好,但是当它进入aharris时,它会失败并不断给我aharris 。 这
3回复

正则表达式

我正在尝试获取以下标签之间的所有文本,但这只是不行 我已经编写了提取函数以将html作为字符串获取。 我在看html敏捷包的示例,但没有文件另存为html docs
2回复

正则表达式

我正在从看起来像这样的CSV文件中获取数据: 我正在尝试将Rob ^和Bob ^之间的所有内容归为一组。 到目前为止,我的Regex看起来像\\w+\\^(,\\n\\w+)+但是Bob被选中了。 我曾尝试使用前瞻性,但没有取得任何成功。 谢谢
2回复

用于标记连接字符串的正则表达式

我有2种不同类型的连接字符串(由于遗留原因,由于种种原因,我无法在任何地方进行修复,而这与本文无关)。 我需要将它们分解为键/值对。 以下是示例连接字符串: 对于前两种情况,我可以使用正则表达式: 对于第三个,我可以使用正则表达式: 如何将其转换为适用于所有情况的正则
2回复

正则表达式拆分包含标记的文本

如果我有一个字符串,如“abcdef {123} ghi {456} kl”,我想创建一个正则表达式,它将给我所有部分分隔如下: 我正在使用此代码,但无法弄清楚表达式应该是什么:
5回复

正则表达式 - 我只想匹配正则表达式中的开始标记

我正在制作一个正则表达式,其中我只想匹配错误的标签,例如: <p> *some text here, some other tags may be here as well but no ending 'p' tag* </p> 在上面相同的文本中我想得到<
2回复

使用正则表达式标记化数学方程

我正在尝试将方程式字符串拆分为标记。 我已经找到了一个很好的起点'([[A-Za-z] + | [0-9。] + | [&=> <\\ |!] + | \\ S)'。 但是,这对于负数有麻烦: 并且 看起来我的正则表达式可以使用某种东西来检查“-”左侧是否有数字,