0

このxml文字列の内容をJavaで置き換える必要があります

<My:tag>value_1 22&#xA;value_2 54&#xA;value_3 11</My:tag>

したがって、この文字列は xml から取得されたものであり、取得すると次の結果が得られます。

<My:tag>value_1 22
value_2 54
value_3 11</My:tag>

この方法でコンテンツを置き換えようとすると:

String regex =  "(<My:tag>)(.*)(</My:tag>)";
String new_string = old_string.replaceAll(regex,"<My:tag> new_stuff </My:tag>");

結果が出ません。&#xA;シンボルのせいだと思う

&#xA;しかし、記号なしで文字列を置き換えようとすると、すべてうまくいきます。

提案?ありがとう

4

3 に答える 3

1

&#xA;ある時点で実際の改行に変換されない限り、それ自体が問題を引き起こす理由はわかりません。

この場合、DOTALL モードを有効にして、. 改行にも一致します (デフォルトでは一致しません)。

DOTALL を有効にするには、式を で開始するだけ(?s)
です (Pattern オブジェクトを作成した場合は、それにフラグを渡すこともできます)。

とにかく、これを試してください:

String regex =  "(?s)(?<=<(My:tag)>).*?(?=</\1>)";
String new_string = old_string.replaceAll(regex,"new_stuff");


たとえば、 (?s:regex-segmentを使用 して、正規表現の特定の部分に対して有効にすることもできます。)

String regex =  "(?<=<(My:tag)>)(?s:.*?)(?=</\1>)";
于 2009-02-01T20:11:09.310 に答える
1

Java 正規表現エンジンがどのように機能するかは 100% わかりませんが、エンティティが問題を引き起こすとは想像できません。式全体を置き換え、何も抽出しないため、最初に括弧を単純に削除するようにしてください。

ただし、エンティティが実際に改行に変換されている場合、明示的に複数行の一致を行わない限り、正規表現がそれをキャッチしない可能性があります。あなたもやってみることができます

[.\n]*

あなたの代わりに

.*

ただし、これは貪欲な入札である可能性があり、マッチャーが処理するにはバックトラックが多すぎます。残念ながら、このマシンには Java がインストールされていないので、実際に試してテストすることはできません。もう 1 つの可能性は、次のように積極的に次の開き山かっこを探すことです。

[^<]* 

編集:
あなたが示唆したように、私はあなたのリンクを試してみましたが、以下は完全に機能しました:

表現:

<My:tag>[^<]*</My:tag>

置換:

<My:tag> new_stuff </My:tag>

テスト文字列:

<My:tag>value_1 22&#xA;value_2 54&#xA;value_3 11</My:tag>
于 2009-02-01T19:53:10.280 に答える
0

XMLの操作には、正規表現を使用する代わりに、JDOMDOM4Jなどの XML ライブラリを使用することをお勧めします。

于 2009-02-01T19:40:39.760 に答える