0

私の質問は少し冗長なので、例を挙げて説明しようと思います。

正確ではありませんが、解析する必要がある XML に多少似たファイルがあります。ファイル内の要素は、通常、次のような XML 形式と同様に表示されます。

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

ファイルを個々のタグのセットに分割して、1 つの要素が

<greeting>hello</greeting>

そしてもう一つは

<goodbye>bye</goodbye>

当然、空の要素の場合は、それ自体の要素になって<person>しまい</person>ますが、ファイル全体をどのように解析したいのかという理由で、それで完全に問題ありません。

私が直面している問題は、ファイル全体を配列に分割する最善の方法です。ファイルには改行がまったくないため、表示どおりに書き出されます。こんな感じにしてみました

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

しかし問題は、山括弧を関連付けられたタグの一部として保持せず、それらを分離することです。> と < 文字のでファイルを分割する方法はありますか?

4

1 に答える 1

3

これが最善の解決策かどうかはわかりませんが、質問に直接答えるには、後読みアサーションと先読みアサーションを使用して角度を分割できます。

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

違いは。パーツを消費しないよう><に、その間の位置を一致させます。

別のアイデアは、後方参照を使用して正しい (この名前の最初の終了タグと一致します。同一のタグがネストされている場合は間違っています) 終了タグ、次のようなものを使用することです。

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

ここでRegexrを参照してください

この正規表現には 2 つの参照があります。1 つ目は終了タグの照合に使用され、2 つ目はタグの内容を検索します。

もちろん、最初は「person」タグに一致しますが、他のタグは$2. 結果が空の配列になるまで、 $2 で正規表現を再帰的に使用する必要があります。

于 2012-04-13T05:08:57.107 に答える