2013-10-04 3 views
0

나는 Pattern 개체를 사용하여 정규식 문자열의 모든 발행 수를 대체하기 위해 노력하고있어,하지만 그것은 단지 이상한 발행 수 대체일치 문자 mutliple 번

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). 그것을 허용 할 수 있습니까?

답변

0

일치하는 숫자가 같은 문자 -을 (를) 사용하려고하는 것 같습니다. 이 경우 아마도 look-around 메커니즘을 사용해야합니다. 예를 들어, 당신은

(^|-)(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 
합니다