正規表現を機能させるのに問題があります。特定のXMLタグのテキストの大きな複数行のブロックを解析しようとしています。これをXMLライブラリで解析しない理由は、実際にはESQLのブロックの一部でもあるためです。私が使用している行は次のとおりです。
Pattern.compile(".*'(Invoice|Package|Mapping|Post)' AS STAGE.*(<(ESQL|ProcessInvoice)>.+)</(ESQL|ProcessInvoice)>).*", Pattern.DOTALL);
私の問題は実際には2つあります。
(Invoice|Package|Mapping|Post)
リストから請求書を削除しない限り、セクションは請求書にのみ一致します。次に、マッピングのみに一致します。奇妙なことに、Packageはテキストブロックの中央にあり(ブロックはInvoice, Package, Mapping, Post
テキストファイルで順序付けられており、Postはオプションであるため、そこにない場合もあります)、マッピングは終わりに近づいています。<(ESQL|ProcessInvoice)>
セクションは実際にブロックを取ります(最後のブロック、最後のProcessInvoice
3ブロックを超え<ESQL>
ます)。(ESQL|ProcessInvoice)
パーツを取り外してそのまま作成<ESQL>
すると、奇妙なことに、請求書の最初のブロックではなく、Packageブロックが使用されます。これは、これを以前の4つのセクションの1つ(つまり、ちょうど)に絞り込んでも、どこにも変更がない場合でも、引き続き問題になりますInvoice
。最初のセクションをスキップして、2番目のセクションを取得します。
---補遺---次の入力例(コンテンツ用に編集):
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;
意図するグループ化は(それぞれ)次のようになります。
- 請求書
- パッケージ
- マッピング
そしてデータ:
- ESQLブロック1ESQLブロック2
- ESQLブロック3
- 別のESQLブロック
を説明するために、正規表現を少し変更したことに言及する必要があります。これは次のようになります。
.*?'(Package|Invoice|Post)' AS STAGE.*?<Rule>(.+?)</Rule>.*?
この交代は、4つの可能なセクションのうちの3つで機能しているようですが、以前の問題の一部は、<(ESQL|ProcessInvoice)>
別のグループ内で使用しようとしたことだったと思います。せずにやろうとする<Rule>(.+?)</Rule>.*?
と、代わりに(<ESQL>.+?</ESQL>)
今は働きたくないだけです。