使用多个正则表达式捕获匹配的嵌套xml标记

使用多个正则表达式捕获匹配的嵌套xml标记,xml,regex,Xml,Regex,假设我有一个xml文件,其中包含嵌套在其内部的标记,例如 <TAG>one<TAG>two</TAG>one</TAG> onetwoone 从中,我有两个正则表达式的例子,它们与这个字符串不匹配 <TAG>one<TAG>two</TAG> onetwo 这是不平衡的。根据谷歌的说法,不可能找到一个能够正确解析html的正则表达式,例如或 正则表达式不可能进行完整的HTML解析,因为它依赖于匹配开始和结

假设我有一个xml文件,其中包含嵌套在其内部的标记,例如

<TAG>one<TAG>two</TAG>one</TAG>
onetwoone
从中,我有两个正则表达式的例子,它们与这个字符串不匹配

<TAG>one<TAG>two</TAG>
onetwo
这是不平衡的。根据谷歌的说法,不可能找到一个能够正确解析html的正则表达式,例如或

正则表达式不可能进行完整的HTML解析,因为它依赖于匹配开始和结束标记,而正则表达式则不可能

正则表达式只能与正则语言匹配,但HTML是一种上下文无关的语言。在HTML上使用regexp所能做的唯一一件事是启发式,但这不会在所有条件下都有效。应该可以呈现一个HTML文件,该文件将被任何正则表达式错误地匹配


这是一个清晰的理论答案,但它让我思考:通过编程,使用多个正则表达式和/或循环是否可能?

正则表达式不是正则表达式。许多主要的正则表达式风格允许您匹配各种递归结构

因此,为了匹配PCRE中的示例,您可以编写():

(?:[^]+|(?R))*

不需要任何额外的代码或正则表达式。这不是XML解析器。

正则表达式不是正则表达式。许多主要的正则表达式风格允许您匹配各种递归结构

因此,为了匹配PCRE中的示例,您可以编写():

(?:[^]+|(?R))*

不需要任何额外的代码或正则表达式。这不是一个XML解析器。

这里是一个简单的递归下降XML解析器,我现在正在编写它,所以它会有点粗糙,准备就绪,用ruby编写,因为您没有指定语言。 不要在生产中使用(或者在任何地方,实际上,这只是出于好奇):

string=“onetwoone”
正则表达式xml解析器=->string{
stuff_before=[]
匹配项=[]
stuff_after=[]
而字符串=~/>/
在匹配项目之前填充{
{match_item[1]=>regex_xml_解析器[match_item[2]}
}
正则表达式xml解析器[字符串]

请记住,我们基本上是在这里构建一个解析器,因此我认为不用说,使用已经存在的解析器会更容易一些。

这是一个简单的递归下降xml解析器,我现在正在编写它,因此它将有点粗糙和容易,使用ruby编写,因为您没有指定语言。 不要在生产中使用(或者在任何地方,实际上,这只是出于好奇):

string=“onetwoone”
正则表达式xml解析器=->string{
stuff_before=[]
匹配项=[]
stuff_after=[]
而字符串=~/>/
在匹配项目之前填充{
{match_item[1]=>regex_xml_解析器[match_item[2]}
}
正则表达式xml解析器[字符串]

请记住,我们基本上是在这里构建一个解析器,因此我认为不用说,使用一个已经存在的解析器会更容易一些。

当然,但你可能会伤害自己。我根据你的示例制作了一个解析器。它一次搜索最深的元素,你只需放弃它,留下一个标识符,然后再次尝试捕获。这是吗一个奇怪的问题,还是因为你想用它来解决一个问题?因为如果后者有几个XML解析器对我们来说非常简单。什么是样本输入和样本输出,请在阅读该答案时清楚,也请阅读评论:@ MIKEH-R:只是出于好奇,真的。做我想做的。当然,但你可能会伤害你自己。我根据你的例子做了。它一次搜索最深的元素,你只需要放弃它,留下一个标识符,然后再次尝试捕获。这是出于好奇还是因为你想用它来解决问题?因为如果后者有几个XML解析器这是非常简单的用法。什么是样本输入和样本输出,如果你读到这个答案,请清楚,也考虑读评论:@ MiKeH-R:只是出于好奇,真的。我用C*XML类来做我想做的事。+ 1,很高兴看到你再次回答正则表达式问题。在<代码> PCRE < /代码>中,你甚至可以制作一个<代码>。>++(但你当然知道):@Unihedron,你是什么意思?你当然能做到。例如:
(?:[^]|(?R))*+
@zx81,最近没有太多时间。:-)哇,我不知道
(?R)
construct,nice.+1,很高兴看到你再次回答一个正则表达式问题。在
PCRE
中,你甚至可以把它变成
++
(但你当然知道):@Unihedron,你是什么意思?当然可以。例如:
(?:[^]|(?R))*+
@zx81,最近没有太多的时间来讨论这个问题。:-)哇,我不知道
(?R)
构造,很好。
<TAG>(?:[^<>]+|(?R))*</TAG>
string = "<TAG>one<OTHER_TAG>two</OTHER_TAG>one</TAG>"
regex_xml_parser = -> string {
  stuff_before = []
  matches = []
  stuff_after = []
  while string =~ />/
    stuff_before << string[ /^[^<]*/ ]
    string.sub!(/^[^<]*/, '')
    matches << string.match(/<([^>]+)>(.*)<\/\1>/)
    string.sub!(/<([^>]+)>(.*)<\/\1>/, '')
    stuff_after << string[ /[^>]*$/ ]
    string.sub!(/[^>]*$/, '')
    p [ stuff_after, "stuff_after" ]
  end
  values = stuff_before + stuff_after + [string]
  return_value = values.clone
  matching_nodes = matches.map { |match| make_matches[match]}
  {values: return_value.select { |x| x != "" },
  nodes: matching_nodes}
}

make_matches = -> match_item {
  {match_item[1] => regex_xml_parser[match_item[2]]}
}

regex_xml_parser[string]