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,在这种情况下,它会捕获.as$2并认为匹配完成;如果它发现它没有立即跟随.X,它会继续使用您已经使用的相同逻辑,将后续字符捕获为$3.

(注意:我已经用你的两个例子对此进行了测试,但显然它可能会错过你需要支持的其他情况。我建议你也自己测试一下。)

于 2012-11-04T01:38:04.927 回答