如何在perl中拆分字符串,保留分隔符,并在分隔符之间进行拆分?

时间:2012-04-13 04:59:46

标签: xml regex perl split

我的问题有点罗嗦,所以我会尝试用一个例子来解释。

我有一个类似于XML的文件,我需要解析,但不完全是。文件中的元素通常显示类似于XML格式,如

<person><greeting>hello</greeting><goodbye>bye</goodbye></person>

我想将文件拆分为单独的标记集,以便一个元素

<greeting>hello</greeting>

,另一个是

<goodbye>bye</goodbye>

当然,对于一个空元素,<person></person>最终将成为他们自己的元素,因为我想要整体解析文件,所以我完全可以。

我遇到的问题是如何最好地将整个文件拆分成一个数组,因为文件中根本没有新行,它就像你看到的那样写出来了。我试着这样做

my @array = split(/(><)/, $file)

但问题是它不会将角度括号保留为关联标记的一部分,而是将它们分开。我有办法将文件分割为&gt;和&lt;字符?

1 个答案:

答案 0 :(得分:3)

我不确定这是否是最佳解决方案,但要直接回答您的问题,您可以使用lookbehind and lookahead assertions在角度之间进行分割。

my @array = split(/(?<=>)(?=<)/, $file)

不同之处在于。他们不消耗><部分,他们匹配两者之间的位置。

另一个想法是使用反向引用来匹配正确的(它匹配第一个结束标记与此名称,当嵌套相同的标记时是错误的)结束标记,类似这样

<([^>]*)>(.*?)</\1>

here on Regexr

此正则表达式中有两个引用。第一个用于匹配结束标记,第二个用于匹配标记的内容。

当然它首先匹配“person”标签,但您会在$2中找到其他标签。你必须在$ 2上递归使用正则表达式,直到结果为空数组。