0

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

我有一个有点类似于我需要解析的 XML 的文件,尽管不完全一样。文件中的元素通常显示为类似于 XML 格式,例如

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

我想把文件分成单独的标签集,这样一个元素就是

<greeting>hello</greeting>

另一个是

<goodbye>bye</goodbye>

自然对于一个空元素,<person>并且</person>最终将成为它们自己的元素,我完全可以接受,因为我想如何解析整个文件。

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

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

但问题是它不会将尖括号保留为关联标签的一部分,而是将它们分开。有没有办法让我在 > 和 < 字符之间分割文件?

4

1 回答 1

3

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

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

不同的是。他们不消耗><零件,它们与两者之间的位置相匹配。

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

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

在 Regexr 上查看

您在此正则表达式中有两个引用。第一个用于匹配结束标签,在第二个中您将找到标签的内容。

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

于 2012-04-13T05:08:57.107 回答