1

私は String を持っています:testing<b>s<b>tringwit<b>h</b>nomean<b>s</b>ing

文字sを他の文字シーケンスに置き換えたいとします<b>X</b>が、文字シーケンスsをそのまま残したい、つまり、正規表現は文字 s を前の文字 "<" で更新しないでください。

私はJAVAコードを使用しました:

String str = testing<b>s<b>tringwit<b>h</b>nomean<b>s</b>ing;
str = str.replace("s[^<]", "<b>X</b>");

問題は、正規表現が s とそれに続く文字の 2 文字に一致し、それが ">" でない場合、Sting.replaceが両方の文字を置き換えてしまうことです。次の文字ではなく、 sのみを置き換えたい。

どんな助けでも大歓迎です。このような置換がたくさんあるので、各文字に一致するループを使用して順次更新したくありません。

4

3 に答える 3

1

周囲のテキストをキャプチャするのではなく、アサーションするためにルックアラウンドを使用します。

str = str.replaceAll("s(?![^<]))", "whatever");

または、後方参照を使用してキャプチャしてプット バックします$1

str = str.replaceAll("s([^<])", "whatever$1");

(プレーンテキストを使用replaceAll()する)ではなく、(正規表現を使用する)を使用する必要があることに注意してください。replace()

于 2013-09-12T23:26:01.660 に答える
1

否定的な先読みが必要なようです:

s(?!<)

String str = "testing<b>s<b>tringwit<b>h</b>nomean<b>s</b>ing;";
System.out.println(str.replaceAll("s(?!<)", "<b>X</b>"));

出力:

te<b>X</b>ting<b>s<b>tringwit<b>h</b>nomean<b>s</b>ing;
于 2013-09-12T22:25:56.033 に答える