1

正規表現を機能させるのに問題があります。特定のXMLタグのテキストの大きな複数行のブロックを解析しようとしています。これをXMLライブラリで解析しない理由は、実際にはESQLのブロックの一部でもあるためです。私が使用している行は次のとおりです。

Pattern.compile(".*'(Invoice|Package|Mapping|Post)' AS STAGE.*(<(ESQL|ProcessInvoice)>.+)</(ESQL|ProcessInvoice)>).*", Pattern.DOTALL);

私の問題は実際には2つあります。

  1. (Invoice|Package|Mapping|Post)リストから請求書を削除しない限り、セクションは請求書にのみ一致します。次に、マッピングのみに一致します。奇妙なことに、Packageはテキストブロックの中央にあり(ブロックはInvoice, Package, Mapping, Postテキストファイルで順序付けられており、Postはオプションであるため、そこにない場合もあります)、マッピングは終わりに近づいています。

  2. <(ESQL|ProcessInvoice)>セクションは実際にブロックを取ります(最後のブロック、最後のProcessInvoice3ブロックを超え<ESQL>ます)。(ESQL|ProcessInvoice)パーツを取り外してそのまま作成<ESQL>すると、奇妙なことに、請求書の最初のブロックではなく、Packageブロックが使用されます。これは、これを以前の4つのセクションの1つ(つまり、ちょうど)に絞り込んでも、どこにも変更がない場合でも、引き続き問題になりますInvoice。最初のセクションをスキップして、2番目のセクションを取得します。

私は正規表現の第一人者ではないことを認めますが、これはかなり奇妙な行動のようです。マッチャーで.reset()を呼び出しても、以前のブロックは認識されません。また、.find()は、可能なすべての一致を繰り返すのではなく、1つの一致のみを検索します。

---補遺---次の入力例(コンテンツ用に編集):

CREATE COMPUTE MODULE Module_Name
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN       
    Header stuff,
    'Invoice' AS STAGE,
    Gibberish here
    '<Rule>
    <ESQL>
        ESQL Block 1
    </ESQL>
    <ESQL>
        ESQL Block 2
    </ESQL> 
    </Rule>' AS CONTENT);

    Header stuff,
    'Package' AS STAGE,
    Gibberish here
    '<Rule>
    <ESQL>
        ESQL Block 3
    </ESQL>
    </Rule>' AS CONTENT);

    Header stuff as well,
    'Mapping' AS STAGE,
    Gibberish here too
    '<ProcessInvoice>
        Another ESQL Block
    </ProcessInvoice>' AS CONTENT);
END;
END MODULE;

意図するグループ化は(それぞれ)次のようになります。

  1. 請求書
  2. パッケージ
  3. マッピング

そしてデータ:

  1. ESQLブロック1ESQLブロック2
  2. ESQLブロック3
  3. 別のESQLブロック

を説明するために、正規表現を少し変更したことに言及する必要があります。これは次のようになります。

.*?'(Package|Invoice|Post)' AS STAGE.*?<Rule>(.+?)</Rule>.*?

この交代は、4つの可能なセクションのうちの3つで機能しているようですが、以前の問題の一部は、<(ESQL|ProcessInvoice)>別のグループ内で使用しようとしたことだったと思います。せずにやろうとする<Rule>(.+?)</Rule>.*?と、代わりに(<ESQL>.+?</ESQL>)今は働きたくないだけです。

4

1 に答える 1

1

欲張りでないように変更.*します。.*?それはおそらくあなたを助けるでしょう。

しかし、実際には、XMLパーサーを使用したほうがよいでしょう。XMLは他のテキスト内に埋め込まれているため、XMLパーサーを使用できないと言います。次に、XMLのブロック全体を(正規表現または別の適切なメソッドを使用して)抽出し、それをXMLパーサーに配置することをお勧めします。

于 2012-03-15T18:50:24.913 に答える