1

我有一个字符串: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>");

问题是正则表达式将匹配 2 个字符,如果不是“>”,则 s 和后续字符,并且Sting.replace将替换这两个字符。我只想替换s而不是以下字符。

任何帮助,将不胜感激。由于我有很多这样的替换,我不想使用匹配每个字符的循环并按顺序更新它。

4

3 回答 3

2

还有其他方法,例如,您可以捕获第二个字符并将其放回:

str = str.replaceAll("s([^<])", "<b>X\\1</b>");
于 2013-09-12T22:30:54.280 回答
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 回答