特定标记的正则表达式

问题描述 投票:2回答:11

我正在.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>

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

谢谢。

.net regex
11个回答
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解析器的另一个原因。


0
投票

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

正则表达式实际上不是用于此目的的理想工具,但是如果您的情况很简单以至于您不想真正解析HTML,则可以使用.NET专有的Microsoft专有扩展来实现此目的。有关一个很好的解释,请参阅 <div id="super_special"> <div>Nothing</div>


0
投票

单独的正则表达式根本不足以解决您的问题。你需要更强大的东西,比如无上下文的语法。请参阅Wikipedia上的this nice article by Morten Maate

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


6
投票

请相当自豪,请大家帮忙:使用HTML解析器来解析HTML。认真。这就是他们的目的。

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

无论如何,你必须告诉你的Regex引擎匹配多行而不是一行。在一些最流行的那些你通过应用qazxsw po修饰符来做到这一点。

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


1
投票

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

/m

1
投票

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


1
投票

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

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

1
投票

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

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

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

但不要使用REGEXPS PARSE HTML。这是维护地狱的直接途径。使用像Beautiful Soup这样的HTML解析器。检查re.compile('<div id="super_special">.*?</div>',re.S).sub(your_html,'') these在这方面的有用资源。


1
投票

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

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

通常,使用正则表达式匹配XML / HTML并不是一个好主意,因为XML / HTML标记可以嵌套,例如:

links

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

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

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


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.