正则表达式捕获两个带有重复项的XML标记之间的完全匹配

时间:2017-06-26 17:06:15

标签: java regex

<Head>
            <Post>value</Post>
            <PstlAdr>
                        <Ctry>…</Ctry>
                        <AdrLine>line1</AdrLine>
                        <AdrLine>line2</AdrLine>
                        <AdrLine>line3</AdrLine>
                        <AdrLine>line4</AdrLine>
            </PstlAdr>
</Head>

我想捕获FIRST AdrLine标记和LAST / AdrLine标记之间的所有文本。

表示捕获的组将包含:

                <AdrLine>line1</AdrLine>
                <AdrLine>line2</AdrLine>
                <AdrLine>line3</AdrLine>
                <AdrLine>line4</AdrLine>

3 个答案:

答案 0 :(得分:1)

XML a Regular Language因此无法通过常规表达式进行解析(除非您使用的是已知的XML子集,您可以使用用正则表达式解析)。改为使用XML解析器。

答案 1 :(得分:1)

我完全同意RegExp不是解析XML文件的最佳解决方案。

但如果你愿意,并且完全确定你的数据格式,请使用:

#(?:<AdrLine>.+?</AdrLine>\s*)+#

RegExp101演示:https://regex101.com/r/hoikwl/1

答案 2 :(得分:0)

根据定义,正则表达式不允许递归。 (允许递归的构造被称为 - 或等同于 - pushdown automata;示例是context-free grammar)。

由于HTML和XML具有递归结构,因此在一般情况下不能使用正则表达式解析HTML。

但是,如果你在一个非常有限的结构上行动,你可以尝试匹配所有<AdrLine>标签,只需拔出Java中的第一个和最后一个匹配项。但是,你必须有一个非常严格的结构。