使用正则表达式查找不在html标记中的特定字符串

时间:2009-06-05 20:53:59

标签: .net html regex

我正在尝试使用特定的正则表达式时遇到一些困难。我在文档中搜索字符串的每次出现(为了我的目的,我会说它是“ mystring ”),例如,它在标签中,例如。

<a href="_mystring_">

不应该匹配,但是

<a href="someotherstring">_mystring_</a>

应该匹配,因为它不在标签内(意思是“&lt;和&gt;标记内部”)我也在使用.NET的正则表达式函数。

8 个答案:

答案 0 :(得分:19)

这应该这样做:

(?<!<[^>]*)_mystring_

它使用负面外观来检查匹配的字符串是否没有&lt;之前没有相应的&gt;

答案 1 :(得分:9)

当您的正则表达式处理器不支持可变长度后,请尝试:

(<.+?>[^<>]*?)(_mystring_)([^<>]*?<.+?>)

保留捕获组1和3并替换捕获组2:

例如,在Eclipse中,找到:

(<.+?>[^<>]*?)(_mystring_)([^<>]*?<.+?>)

并替换为:

$1_newString_$3

(其他正则表达式处理器可能使用不同的捕获组语法,例如\ 1)

答案 2 :(得分:7)

另一个适用于我的搜索正则表达式

(?![^<]*>)_mystring_

来源:https://stackoverflow.com/a/857819/1106878

答案 3 :(得分:2)

快速而又脏的替代方法是使用带回调的正则表达式替换函数来编码标记的内容(&lt;和&gt;之间的所有内容),例如使用base64,然后运行搜索,然后运行另一个回调来解码你的标签内容。

当你需要从正则表达式搜索中排除特定标记时,这也可以节省大量的时间 - 首先对它们进行模糊处理并将它们包装在与搜索不匹配的标记中,然后运行您的搜索,然后对标记中的任何内容进行反混淆处理。

答案 4 :(得分:0)

为什么要使用正则表达式?

对于xhtml,将其加载到XDocument / XmlDocument中;对于(非x)html,Html Agility Pack似乎是一个更明智的选择...

无论哪种方式,都会将html解析为DOM,以便您可以遍历节点并检查它们。

答案 5 :(得分:0)

正则表达式搜索在XML中通常不是一个好主意。搜索表达式匹配很多或太少都会遇到问题太容易了。制定正则表达式几乎是不可能的,该正则表达式可以正确识别和处理XML允许的CDATA部分,处理指令(PI)和转义序列。

除非你完全控制你正在获得的XML内容并且可以保证它不会包含这样的结构(并且不会改变),我建议使用某种XML解析器(XDocument或XmlDocument in。)例如,网。)

话虽如此,如果您仍然打算使用正则表达式作为搜索机制,那么类似下面的内容应该可以使用.NET中的RegEx类。您可能希望在test it out这样的网站上Regexlib使用您自己的一些测试用例。您也可以搜索他们的正则表达式目录,以找到可能符合您需求的内容。

[&GT]。(_ MyString的_)。并[d]

答案 6 :(得分:0)

忽略那些确实存在其他方式,并且我不是真正的正则表达式专家,但有一件事突然出现在我脑海中:

  • 首先找到标签中所有的 mystring - 因为我无法编写表达式来执行相反的操作:)
  • 将其更改为其他内容
  • 然后根据需要替换所有其他 mystring (不在标签中)
  • 恢复标记
  • 中的原始 mystring

因此,使用<[^>]*?(mystring)[^>]*>您可以找到已标记的内容。用 otherstring 替换那些。你是否正常替换剩下的 mystring 。将 otherstring 替换回 mystring

粗暴但有效......也许。

答案 7 :(得分:0)

_mystring_(?![^<]*?>)

但是需要有效的HTML结构。