0

次のようなxmlがあります。

<records>
  <Customer>
    <Reference>123</Reference>
    <Name>John Smith</Name>    
    <Address1>1, The street</Address1>
    <Address2>Upper Town Street</Address2>
    <Address3>Anytown</Address3>
    <Address4>County</Address4>
    <PostCode>POS TCD</PostCode>
  </Customer>
</records>

ただし、 Address2 はオプションであるため、これも有効です。

<records>
  <Customer>
    <Reference>123</Reference>
    <Name>John Smith</Name>    
    <Address1>1, The street</Address1>
    <Address3>Anytown</Address3>
    <Address4>County</Address4>
    <PostCode>POS TCD</PostCode>
  </Customer>
</records>

(注: これは xml スニペットを切り詰めたものです)

Address2 が指定されている場合に正しく一致する次の正規表現があります。

<Reference>(?<Reference>.*)</Reference>[\w|\W]*<Name>(?<Name>.*)</Name>[\w|\W]*<Address1>(?<Address1>.*)</Address1>[\w|\W]*<Address2>(?<Address2>.*)</Address2>

Address2 が指定されていない場合は機能しません。私が持っている最も近いものは次のとおりです。

<Reference>(?<Reference>.*)</Reference>[\w|\W]*<Name>(?<Name>.*)</Name>[\w|\W]*<Address1>(?<Address1>.*)</Address1>[\w|\W]*(<Address2>(?<Address2>.*)</Address2>)?

これは、両方の xml スニペットの Reference、Name、および Address1 に一致して入力しますが、最初のスニペットの Address 2 に Upper Town Street の値を設定するのではなく、両方のケースで Address2 を空白のままにします。

余談ですが、xmlパーサーを使用する方がおそらく簡単であることはわかっていますが、xmlはきれいではなく、これは迅速かつ簡単な解決策になるはずでした(!)。また、これを一連の正規表現に分解して解決できることもわかっていますが、これはちょっとした知的課題になっています。そして、解決策を教えていただきたいです。

4

2 に答える 2

2

を使用する代わりに、壊れたを修正し、最も興味深い問題に気を配ってください =)

ファイルを解析するための適切なツールではありません。を解析することは解決された問題です。車輪を再発明しようとしないでください。

既に述べたように、XML パーサーを使用します。これらのいくつかを提供したい場合は、元の POST にあなたの言語を追加してください。

を解析するために私が知っている最高のものはです。


XHTML 自己完結型タグを除く正規表​​現一致開始タグを参照してください

于 2013-03-27T14:39:58.743 に答える
1

迅速で汚い答え:

<Reference>(?<Reference>.*)</Reference>[\w\W]*?<Name>(?<Name>.*)</Name>[\w\W]*?<Address1>(?<Address1>.*)</Address1>[\w\W]*?(<Address2>(?<Address2>.*)</Address2>)?

まず、|;を削除しました。何も害はありませんでしたが、不要でした。 [\w\W]already は、単語の文字、または単語の文字ではない文字を意味します。他のほとんどのメタ文字と同様|に、文字クラス内での特別な意味を失い、それ自体に一致します。

しかし、要点は を に変更し**?、貪欲にならないようにすることでした。それぞれ[\w\W]*が最初にテキストの残り全体を飲み込み、次にバックトラックして、次の必要な部分 (例: <Name>(?<Name>.*)</Name>) に一致させることができます。ただし、このAddress2部分は必須ではないため、正規表現エンジンはそれを取り込むためにわざわざバックトラックする必要はありません。

量指定子を欲張らないようにすると、優先度が逆になります。次の文字を飲み込む前に、まず正規表現の次の部分との一致を試みます。これにより、Address2オプションであっても、行が存在する場合に一致することが保証されます。

しかし、XML が実際に表示されたとおりにフォーマットされている場合、要素間にあるのは空白だけです。を使用するだけ\s*で、一致が多すぎたり少なすぎたりすることを心配する必要はありません。

于 2013-03-27T17:12:15.110 に答える