使用正则表达式匹配HTML标签并提取文本

7

我有一个这样的测试字符串:

<customtag>hey</customtag>

我想使用正则表达式来修改“customtag”标记之间的文本,使其看起来像这样:

<customtag>hey, this is changed!</customtag>

我知道可以使用MatchEvaluator来修改文本,但我不确定应该使用什么正则表达式语法。非常感谢您提供任何帮助。


2
迄今为止这个问题的最佳答案 - Scott Chamberlain
5个回答

15

我也不会为此使用正则表达式,但如果你必须使用,这个表达式应该可以工作:

<customtag>(.+?)</customtag>

谢谢 - 这个完美地解决了问题。通常我不会使用正则表达式来解析HTML,但是这个HTML来自内部系统并且格式正确。 - Jon Tackabury
2
作为对他人的警告:它不能在正确形式的语法 |<customtag><customtag>Some text</customtag>|</customtag> 上工作 - 管道符号之间的区域是匹配的,因此第二个 <customtag> 将被删除,留下了格式不正确的 XML。 - Tom Leys
1
是的,这就是为什么你不应该尝试使用正则表达式解析XML的原因。你可以限制标签之间的内容,并只允许字母、数字和空格,这样会更好一些。但这样就限制了特定的域,所以可以这样写:<customtag>([a-zA-Z0-9 ])+</customtag>。 - Tjofras
2
或只需使用<customtag>([^<]+)</customtag>。但是,HTML不是一种常规语言,因此在更一般的情况下,您不能使用正则表达式来匹配它。这与使用regexp匹配平衡括号的问题相同。 - Bill Karwin

7

在使用正则表达式解析和修改HTML之前,我宁愿咬掉自己的腿。

使用XSLDOM


有两条评论要求我澄清。 正则表达式替换在OP问题的特定情况下有效,但通常来说,正则表达式不是一个好的解决方案。 正则表达式可以匹配正则语言,即可以被有限状态机接受的输入序列。 HTML可以包含任意深度的嵌套标签,因此它不是正则语言。

这与问题有什么关系? 在OP的问题中使用正则表达式是可行的,但是如果<customtag>标记之间的内容包含其他标记怎么办? 如果文本中出现字面上的<字符怎么办? Jon Tackabury提出问题已经11个月了,我猜在那段时间里,他的问题复杂性可能已经增加了。

正则表达式是很好的工具,我经常使用它们。 但是,在需要真正的解析器的输入中使用它们只适用于非常简单的情况。 这些情况几乎不可避免地会超出正则表达式的处理能力。 当发生这种情况时,您会尝试编写更复杂的正则表达式,但是这些很快就变得非常费力来开发和调试。 请准备好在解析要求扩展时放弃正则表达式解决方案。

XSL和DOM是两种标准技术,旨在与XML或XHTML标记一起使用。 这两种技术都知道如何解析结构化标记文件,跟踪嵌套标记,并允许您转换标记属性或内容。

以下是有关如何在C#中使用XSL的几篇文章:

以下是有关如何在C#中使用DOM的几篇文章:

这里有一个.NET库,可以帮助对HTML进行DOM和XSL操作:


嗯,我偶尔会在受控环境中使用它们,用已知一致的机器生成代码来完成快速任务... - PhiLho
4
那你为什么不展示一下如何使用C#中的XSL或DOM来实现呢?轻描淡写很容易,让我们看看真正的代码。使用正则表达式解析通用的HTML并不太合适,但对于针对特定HTML代码做特定事情是完全适用的。 - Jan Goyvaerts
我承认你让我笑了,但是让我们来解释一下,或者提供一个好的解释链接,为什么你宁愿咬掉自己的腿。我猜对于一些程序员来说这很明显,但对于新手来说可能不是吧? - Sam Murray-Sutton

1
如果这两个标签之间没有其他标签,那么这个正则表达式会更安全、更高效:
<customtag>[^<>]*</customtag>

0

0
//This is to replace all HTML Text

var re = new RegExp("<[^>]*>", "g");

var x2 = Content.replace(re,"");

//This is to replace all &nbsp;

var x3 = x2.replace(/\u00a0/g,'');

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