通过字符串中的正则表达式多次匹配字符

时间:2013-10-04 16:42:29

标签: java regex

我尝试使用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

我想这是因为奇数短划线(4x + 1)已经匹配,所以它们不能第二次匹配偶数i。有可能允许吗?

1 个答案:

答案 0 :(得分:0)

似乎您的问题是您尝试在少数匹配中使用相同的字符-。在这种情况下,您应该使用环视机制。例如,您可以更改

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

模式

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

并替换使用$1I。这样,正则表达式只会检查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