2012-06-10 3 views
0

일치하는 패턴에서 파생 된 데이터로 모든 패턴 어커런스를 빠르게 바꿀 수 있습니까?String.replaceAll variation

예를 들어, 문자열 내에서 숫자의 모든 항목을 고정 길이에 0으로 채워진 동일한 숫자로 바꾸려면.

길이가 4 인 경우 ab3cd5ab0003cd0005이됩니다.

내 아이디어는 StringBuilder와 2 개의 패턴을 사용했습니다. 하나는 모든 숫자를 얻고 다른 하나는 숫자가 아닌 모든 것을 얻고 해당 일치 항목을 색인으로 빌더에 추가하는 것입니다.

나는 더 간단한 것이있을 것이라고 생각합니다.

+0

숫자가 alwa가 될 것이라 확신하는 경우 ys는 하나의 숫자가된다면 정규 표현식을 사용하는 것은 꽤 쉽습니다. 그러나 만약 여러분의 채우기가 기존의 숫자의 길이에 의존해야한다면 정규 표현식을 사용한다고 생각하지 않습니다. 다른 사람들이 말하는 호기심). –

답변

2

당신은 아마 당신이 appendReplacementappendTail, 같은 것을 사용 후있어 무엇을 얻을 수 있습니다

수입 있으며, java.util.regex.Pattern을; 가져 오기 java.util.regex.Matcher;

String REGEX = "(\\d+)"; 
String INPUT = "abc3def45"; 
NumberFormat formatter = new DecimalFormat("0000"); 

Pattern p = Pattern.compile(REGEX); 
Matcher m = p.matcher(INPUT); // get a matcher object 
StringBuffer sb = new StringBuffer(); 
while(m.find()){ 
    m.appendReplacement(sb,formatter.format(Integer.parseInt(m.group(1)))); 
} 

m.appendTail(sb); 

String result = sb.toString(); 
+0

테스트 후 대답을 업데이트했습니다. –

+0

이 해결책을 찾아갔습니다. 감사합니다. –

1

당신이 단일 번호 앞에 패드에 원하는 정확히 얼마나 많은 제로 알고 있다면,이 같은 작업을해야합니다 그렇지 않으면

String text = "ab3cd5"; 
text = text.replaceAll("\\d","0000$0"); 
System.out.println(text); 

:

Pattern pattern = Pattern.compile("\\d+"); 
Matcher matcher = pattern.matcher(text); 

StringBuffer result = new StringBuffer(); 
while(matcher.find()){ 
    matcher.appendReplacement(result, String.format("%04d", Integer.parseInt(matcher.group()))); 
} 
matcher.appendTail(result); 
System.out.println(result); 

형식 %04d 수단을 : 4의 길이까지 0으로 채워지는 정수입니다.

관련 문제