0

我有一个这样的 XML 文件结构:

 <word id="15" pos="SS">
          <token>infarto</token>
          <lemmas>infarto</lemmas>
         </word>
         <word id="16" pos="AS">
          <token>miocardico</token>
          <lemmas>miocardico</lemmas>
         </word>
         <word id="17" pos="AS" annotated="head">
          <token>acuto</token>
          <lemmas>acuto</lemmas>
         </word>
         <word id="18" pos="E">
          <token>in</token>
          <lemmas>in</lemmas>
         </word>
         <word id="19" pos="SS">
          <token>corso</token>
          <lemmas>corso</lemmas>
         </word>

我正在尝试做的是获取围绕具有单词 id 17 的单词的“pos”和“token”的值(annotated = “head” one)。

这对于单词 17 之后的所有匹配都没有问题。

(pos=")(.+)(")(\s\S+?)("head")([\s\S]+?)(>)(\w+?)(<+)([\S\s]+?)(pos=")(.+)(")([\s\S]+?)    (token>)(.+)(<)([\s\S]+?)

这为我提供了我想要的所有信息,如果我想扩展,我可以添加

(pos=")(.+)(")([\s\S]+?)(token>)(.+)(<)([\s\S]+?)

到最后。它不漂亮,但它有效。

现在当我想去另一个方向时,我完全被难住了

(pos=")(.+)(")([\s\S]+?)(token>)(.+)(<)([\s\S]+?)(pos=")(.+)(")(\s\S+?)("head")

它不是只匹配第 16 个单词的信息(“注释头”前面的第一个),而是匹配之前的所有信息(第 15 个单词、第 14 个单词、第 13 个单词等)。

我错过了什么?

PS 遗憾的是,使用 XML 解析器不是一种选择。

4

2 回答 2

0

如果您确定您的数据是格式正确的 XML。我认为有可能,请尝试以下步骤:

step1: <word[^>]*>([^<]*(?:(?!<\/?word)<[^<]*)*)<\/word>(ref http://regexr.com?31org )
step2: 从 step 1(group 1) 获取字符串,并匹配<token[^>]*>([^<]*(?:(?!<\/?token)<[^<]*)*)<\/token>(ref http://regexr.com?31ora ) 或<lemmas[^>]*>([^<]*(?:(?!<\/?lemmas)<[^<]*)*)<\/lemmas>(ref http://regexr. com?31ord )

您可以尝试根据您的要求修改这些模式:)

参考:精通正则表达式3

于 2012-08-07T12:25:02.013 回答
0

我认为应该是这样的:

(?s)(<word(?:(?!<word).)*)<word[^>]*?annotated="head".*?(<word[^>](?:(?<!</word>).)*)

结果,组#1 将包含节点“word”,id = 16,组#2 将包含节点“word”,id = 18。

然后,您可以使用正则表达式分别解析每个节点,如下所示:

(?s)<word[^>]*?pos="(?P<pos>[^"]+).*?<token>(?P<token>[^<]+)

你会得到两组“pos”和“token”。

当然可以使用单个正则表达式,但它会非常难看。

于 2012-08-07T18:04:11.990 回答