2

replaceAll()ターゲット文字列の直前と直後の文字をキャプチャする正規表現/置換ペアを作成しようとしています。

単純なケースで機能する私のバージョンは次のとおりです。

String adjacent = "fooaXbcXdbar".replaceAll(".*?(.)X(.).*?(?=(.X)|$)", "$1$2");

これは必要に応じて生成"abcd"されます(最後に先読みすると、文字列の最後まで消費され、単一の呼び出しが機能しreplaceAll()ます)。

ただし、ターゲットの後のキャラクターがターゲットの前のキャラクターでもある場合、解決できないように見えるエッジケースがあります。

String adjacent = "fooaXbXdbar".replaceAll(".*?(.)X(.).*?(?=(.X)|$)", "$1$2");

出品致します"ab"がよろしくお願い致し"abbd"ます。正規表現は一致の先頭部分を消費したため、次の入力は一致しません。

周りを見回してみましたが、うまくいかないようです。


注:ループやコードなどを含むソリューションには興味がありません。言及されたエッジケースで機能する正規表現と置換文字列を探しているだけです。

4

1 に答える 1

2

これはどう:

String adjacent =
    "fooaXbXdbar".replaceAll(".*?(.)X(?:(?=(.)X)|(.).*?(?=.X|$))", "$1$2$3");

?

何をするかというと、のX直後に が続いているかどうかを最初にチェックします。直後に が続かないことが判明した場合は、すでに使用していたのと同じロジックを使用し、後続の文字を としてキャプチャします。.X.$2.X$3

(注:私はあなたの両方の例でこれをテストしましたが、サポートする必要がある他のケースを見逃す可能性があることは明らかです。自分でもテストすることをお勧めします。)

于 2012-11-04T01:38:04.927 に答える