RegEx 有没有一种方法可以在不进入下一个相同标签的情况下捕获 XML 标签中相同的 N 组?

问题描述 投票:0回答:0

我有一个看起来像这样的 XML 文件:

<Table>
  <Persons>
    <Person>
      <ID>71</ID>
      <FullNameLikeX>"sentence expected"</FullNameLikeX>
      <Age>49</Age>
      <FavoriteFood>Banana</FavoriteFood>
      <NameParts>
        <word>Jhon</word>
        <word>Henry</word>
        <word>Abbot</word>
      </NameParts>
    </Person>
    <Person>
      <ID>72</ID>
      <FullNameLikeX>"sentence expected"</FullNameLikeX>
      <Age>26</Age>
      <FavoriteFood>Cake</FavoriteFood>
      <NameParts>
        <word>Cecilia</word>
        <word>Elisabeth</word>
        <word>Maria</word>
        <word>Smith</word>
      </NameParts>
    </Person>
    <Person>
      <ID>73</ID>
      <FullNameLikeX>"sentence expected"</FullNameLikeX>
      <Age>17</Age>
      <FavoriteFood>Lasagna</FavoriteFood>
      <NameParts>
        <word>Luc</word>
        <word>Hernandez</word>
      </NameParts>
    </Person>
  </Persons>
</Table>

我试图用文本编辑器 (Notepad++) 中的正则表达式用实际句子替换“预期句子”部分(对于这里给出的第一个人:“Jhon Henry Abbot like Banana”)。 我的问题是我无法找到一种方法来处理“NameParts”标签中不同数量的“word”标签,而不会导致一个组最终过度进入下一个“Person”标签或该组为空。

想出了这个正则表达式:

(<FullNameLikeX>")[\s\S]*?("<\/FullNameLikeX>)([\s\S]*?<FavoriteFood>([\s\S]*?)<\/FavoriteFood>[\s\S]*?<NameParts>###[\s\S]*?<\/NameParts>)

我已经尝试放置多个(从 1 到 4)而不是###:

(?:[\s\S]*?<word>([\s\S]*?)<\/word>)? 
但是当单词少于这个组数时,组最终会进入下一个人。

(?:[\s\S]*?<word>([\s\S]*?)<\/word>)?? 
它没有到达下一个人,但没有人正在寻找。

(?:[\s\S]*?<word>([\s\S]*?)<\/word>)+?
当字数少于此组数时,组最终会进入下一个人。

(?:[\s\S]*?<word>([\s\S]*?)<\/word>(?![\s\S]*?<\/Person>[\s\S]*?))?
它没有到达下一个人,但捕获组不知何故是空的。

所以基本上有些小组总是要么尝试获得 1 次迭代,即使他们不应该这样做,但最终会过度进入下一个 Person 标签,或者他们在应该获得 1 次时获得 0 次迭代。

有没有一种方法可以捕获不同数量的 XML 标签值,而无需仅使用正则表达式进入另一个标签,或者这是不可能的?

ps:这个 XML 文件看起来很像,实际文件更长,标签名称和值被遮盖了,为了阅读清晰,我用简单的标签名称和值替换了标签名称和值,但文件的格式保持不变相同。(如果它确实有帮助的话,它似乎没有少于 1 个“单词”标签,每个“NameParts”标签不超过 5 个)。

regex xml xml-parsing
© www.soinside.com 2019 - 2024. All rights reserved.