2017-11-09 18 views
-1

Regex 검색에서 여러 그룹을 사용하여 문자열의 많은 부분을 대체했습니다. String.replaceFirst를 사용할 때 Android Java에서 $ 1 $ 2 등을 사용합니다. 예를 들어 replaceFirst라고에 $ 10을 참조 할 때 내 정규식 검색에서 9 개 이상의 그룹을 사용하는 경우안드로이드에서 정규식 자바 - 9 개 이상의 역 참조를 지정하는 방법?

, 그것은 첫 번째 역 참조를 대체 한 후 문자 0

인쇄 내가 사용할 수 있습니다 어쨌든 있나요 열 번째 참조? 그것을 참조하는 다른 방법이 있습니까?

예를 들어, 9 개 이상의 이전 참조를 사용하려고합니다. $ 10 만 $ 1입니다.

String.replaceFirst("(hello)(.*)(this)","$1middle$2"); 
+0

'$ {10}'사용해보기. * Java *에서는 '$ 10'이 예상대로 작동합니다 (https://ideone.com/y44LKM). –

답변

0

TL, 당신은 $10$10로 취급되어 발생하는 경우 DR은, 다음 정규식 (10 개) 캡처 그룹이 없습니다.

대체 값의 $ 백 참조appendReplacement 방법위한 Javadoc에 설명되어

이전 경기 도중 캡처 된 시퀀스에 대한 참조가 포함될 수 대체 문자열 : ${name} 또는 $g 각각 발생 해당 group(name) 또는 group(g)을 각각 평가 한 결과로 대체됩니다. $g의 경우 $ 다음의 첫 번째 숫자는 항상 그룹 참조의 일부로 처리됩니다. 후속 번호는 합법적 인 그룹 참조를 구성 할 경우 g에 통합됩니다. 숫자 '0'부터 '9'까지만 그룹 참조의 잠재적 구성 요소로 간주됩니다. 예를 들어, 두 번째 그룹이 "foo" 문자열과 일치하면 대체 문자열 "$2bar"을 전달하면 "foobar"이 문자열 버퍼에 추가됩니다. 달러 기호 ($)는 앞에 백 슬래시 (\$)를 붙임으로써 대체 문자열에 리터럴로 포함될 수 있습니다.

다음
System.out.println("ABCDEFGHIJKLMN".replaceFirst("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", 
               "$11$10$9$3$2$1")); 

우리가 예를 들어, 개별 그룹으로 처음 11 개 문자를 캡처 :

그래서, 우리는 11 개 그룹을 가정 해 봅시다 group(1)"A"을, group(11)"K"을 반환합니다. 입력 문자열은 14 자이므로 마지막 3 자 (LMN)는 대체되지 않습니다.결과는 다음과 같습니다

KJICBALMN

우리는 정규식에서 캡처 군 (11)을 제거하면, 다음 $11 법적 그룹 참조하지 않고, $1과 문자 1으로 해석됩니다

System.out.println("ABCDEFGHIJKLMN".replaceFirst("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", 
               "$11$10$9$3$2$1")); 

인쇄 : 그래서

A1JICBAKLMN

, 난 f를 경험하면 $10$1 역 참조로 처리되고 리터럴 0으로 처리되고 정규 표현식에는 10 개의 그룹이 없습니다.

+0

안녕하세요, 저는 귀하의 모범을 보았습니다. Android Studio를 사용하고 있습니다. 사용하는 Android 자바 버전은 이것을 지원해서는 안됩니다. 나는이 결과를 얻는다. - A1A0ICBALMN – zeroprobe

0

name them(?<name>...)으로 입력 한 다음 ${name}으로 참조 할 수도 있습니다.

String.replaceFirst("(?<g1>hello)(?<g2>.*)(?<g3>this)","${g1}middle${g2}");