为什么正则表达式无法匹配XML元素?

6
这篇文章认为正则表达式不能匹配嵌套结构,因为正则表达式是有限自动机。
他随后列出了以下问题的答案说明这些问题不能使用正则表达式解决:
1.匹配XML元素 2.匹配C/VB/C#数学表达式 3.匹配有效的正则表达式
由于2和3可以包含方括号;对于正则表达式来说,这种嵌套无法解决。但是为什么无法匹配XML元素呢?(他没有提供示例。)

3
请返回翻译后的文本:relevant: https://dev59.com/X3I-5IYBdhLWcg3wq6do - meder omuraliev
3
与数学表达式中匹配括号/方括号的问题相同。XML 可以无限嵌套,因此无法使用正则表达式作为完整解决方案。 - Rafe Kettler
2
如果你很幸运,那篇文章的作者会给你一个答案。 - alex
7
因为这个<内容>无法保持。 - BoltClock
1
@BoltClock,谢谢你破坏了我的评论:P - alex
显示剩余2条评论
4个回答

3
你可以匹配一些HTML标签,如果你事先知道要匹配的标签。
但是,你不能(可靠或良好地)解析任意HTML。它不是正则语言。

常规语言和非常规语言有什么区别? - Frankie Ribery
@Frankie 维基百科 有一篇很有用的文章。 - alex

1

有理论答案,基于XML是什么样的语法以及正则表达式可以匹配什么样的语法。这些答案有时会因为我们今天使用的大多数正则表达式库可以做一些计算机科学中定义的正式正则表达式无法做到的事情(如反向引用)而出现缺陷。

还有实际答案。实际答案是:不要这样做,因为它是错误的工具,你的代码将很难编写和难以维护,它将是低效的,它将有漏洞,并且当文档结构发生变化时,没有人会知道如何更改它。因为有更好的工具来完成这项工作,称为XML解析器。


1

你如何使用正则表达式匹配这个有效的XML?

<!--<d>>--<<--><div class='foo' id="bar" inline></div>

这就像制作一辆木制汽车。当然你可以尝试去做,但为什么呢?

但是接下来就是解析 XML 的部分。如果你要从一个无限的元素集合中提取可能无限的属性集合,而只能使用有限的组合,那该怎么办呢?由于正则表达式的本质和结构,这是不可能的。


0

正则表达式是没有状态的。要解析 XML 文件,需要状态。一个 < 可能表示打开一个 XML 元素。如果它在注释 <!-- < --> 或属性值 "<" 中,则意味着其他事情。使用正则表达式,您只能用其他事物之前或之后的方式来表达事物。要正确解析 < 作为打开 XML 元素,您需要表达类似以下内容:

< 但不是在 <!-- 之后,如果 <!-- 没有被 --> 跟随,并且不是在 " 之后,如果 " 没有关闭,但仅当 " 是属性时,因为 " 作为文本值对下一个 < 没有影响,否则...

这仅仅是针对一个简单的<符号,甚至没有涵盖所有可能性。有一些XML特殊字符都有相同类型的循环条件。构建一个正则表达式以正确表达所有这些条件对于所有情况来说几乎是不可能的。但使用状态机却非常简单。


1
FSAs/Regexes并不是没有状态的,它们只是使用了一个恒定数量的状态:如果你在匹配ab*时看到了一个a,那么你怎么知道字符串是否匹配,而不需要某种状态。FSAs无法处理嵌套-即使有至少一个未匹配的<>也只能被接受一次。 - tobyodavies
我知道比我更懂术语的人会反对我使用“状态”这个词... :o) 请随意修改我的答案。 - deceze

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