我的问题有点罗嗦,所以我会尝试用一个例子来解释。
我有一个类似于XML的文件,我需要解析,但不完全是。文件中的元素通常显示类似于XML格式,如
<person><greeting>hello</greeting><goodbye>bye</goodbye></person>
我想将文件拆分为单独的标记集,以便一个元素
<greeting>hello</greeting>
,另一个是
<goodbye>bye</goodbye>
当然,对于一个空元素,<person>
和</person>
最终将成为他们自己的元素,因为我想要整体解析文件,所以我完全可以。
我遇到的问题是如何最好地将整个文件拆分成一个数组,因为文件中根本没有新行,它就像你看到的那样写出来了。我试着这样做
my @array = split(/(><)/, $file)
但问题是它不会将角度括号保留为关联标记的一部分,而是将它们分开。我有办法将文件分割为&gt;和&lt;字符?
答案 0 :(得分:3)
我不确定这是否是最佳解决方案,但要直接回答您的问题,您可以使用lookbehind and lookahead assertions在角度之间进行分割。
my @array = split(/(?<=>)(?=<)/, $file)
不同之处在于。他们不消耗><
部分,他们匹配两者之间的位置。
另一个想法是使用反向引用来匹配正确的(它匹配第一个结束标记与此名称,当嵌套相同的标记时是错误的)结束标记,类似这样
<([^>]*)>(.*?)</\1>
此正则表达式中有两个引用。第一个用于匹配结束标记,第二个用于匹配标记的内容。
当然它首先匹配“person”标签,但您会在$2
中找到其他标签。你必须在$ 2上递归使用正则表达式,直到结果为空数组。