我尝试使用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
。有可能允许吗?
答案 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