0

我正在尝试使用对象用正则表达式替换字符串中的所有出现Pattern,但它只替换奇怪的出现:

final Pattern p = Pattern.compile("(^|\\W|\\\\N)(recursive)(\\W|$)", Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
System.out.println(p.matcher("i-i-i").replaceAll("$1I$3"));

这让我回想起:

I-i-I

但我还需要匹配中间的 I ,但不知何故它没有抓住这一点。我还尝试了一个简化的正则表达式(^|-)(I)($|-),并尝试对i-i-i-i-i-i返回的我做同样的事情I-i-I-i-I-i

我猜这是因为奇数破折号(在 4x+1 处)已经匹配,所以它们不能第二次匹配偶数i。有可能允许吗?

4

1 回答 1

0

看来您的问题是您试图-在少数比赛中使用相同的字符。在这种情况下,您可能应该使用环视机制。例如,您可以更改您的

(^|-)(I)($|-) 

拍打

(^|-)(I)(?=($|-)) 

并作为替代使用$1I。这种方式正则表达式只会检查 after 是否I存在$-但不会将其包含在匹配中,所以

final Pattern p = Pattern.compile("(^|-)(I)(?=($|-))",
        Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
System.out.println(p.matcher("i-i-i-i-i-i").replaceAll("$1I"));

印刷

I-I-I-I-I-I
于 2013-10-04T16:51:38.843 回答