0

XMLを介してWord文書を作成しています。プロセスの最後のステップは、空白行を削除することです。xmlが複数行の場合に機能するパターンがあるようです。しかし、それは私のpreg_replaceを壊している単一の行として生成されています。次のXMLについて考えてみます。

**<w:p** w:rsidR="009E48E3" w:rsidRPr="008C0DAB" w:rsidRDefault="009E48E3" w:rsidP="004E0AE3"><w:pPr><w:ind w:right="-540"/></w:pPr><w:r w:rsidRPr="008C0DAB">**<w:t>text that should be included</w:t>**</w:r>**</w:p><w:p** w:rsidR="009E48E3" w:rsidRPr="008C0DAB" w:rsidRDefault="009E48E3" w:rsidP="004E0AE3"><w:pPr><w:numPr><w:ilvl w:val="1"/> <w:numId w:val="10"/></w:numPr><w:tabs><w:tab w:val="clear" w:pos="1440"/><w:tab w:val="num" w:pos="1080"/></w:tabs><w:ind w:right="-540" w:hanging="720"/><w:rPr><w:noProof/></w:rPr></w:pPr><w:r><w:rPr><w:noProof/></w:rPr><w:lastRenderedPageBreak/>**<w:t> ; </w:t>**</w:r>**</w:p>**

読みやすくするためにアスタリスクを挿入しました

空白行は常に<w:t></w:t>タグの間にあり、ピリオドまたはセミコロンが含まれています。したがって、最初の<w:p>タグはそのままにして、2番目のタグは削除する必要があります。

これが私のパターンです:<w:p .*<w:t>[ ]+?(\.|;)[ ]+?<\/w:t>.*?<\/w:p>

どんな助けにも感謝します、ありがとう!

4

2 に答える 2

1

パターンの問題は、最初のパターンがXMLの最後まで読み取られ、最終的に最後のタグ.*の直前に戻ることです。そこから、パターンの残りの部分はXMLの残りの部分と正常に一致します。結果-XML全体がキャプチャされます! <w:t>

Itchyのパターンの問題は、先読みが「先にタグ(?!.*w:p )がない場合のみ」と言うことです。つまり、パターンは最後の<w:p>要素にのみ一致します(削除する必要がある場合、つまり)。 <w:p>

これらの問題はすべて、の使用に起因します.*。私の2部構成のモットーは、絶対に必要でない限り、それを使用しないようにすることです。そして、絶対に使う必要があると思ったら、使わないように頑張ってください:)

次のパターンが機能します。

<w:p [^<]++(?:(?!<w:t>)<[^<]++)++<w:t> *+[\.;] *+<\/w:t>[^<]*+(?:(?!<\/w:p>)<[^<]++)++<\/w:p>

ノート:

  1. .*全く使われていませんでした!
  2. 所有格の数量詞は実際には必要++あり*+ませんが、正規表現を高速化します。
  3. <\/w:t><\/w:r><\/w:p>最後の部分は、要素が常にそのように終了する場合に簡略化できます。
于 2013-01-20T20:14:14.767 に答える
0

この文字列に対して、次のパターンが機能するように指定しました。

<w:p (?!.*w:p ).*?<w:t>[ ]+?(\.|;)[ ]+?<\/w:t>.*?<\/w:p>

Rubularでテストしました。

ネガティブ先読みを使用します。

于 2013-01-20T14:29:59.660 に答える