我有一个看起来像这样的 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 个)。