당신의 묘사, 나는 NNDDDDD
부분 후, 첫 번째 A
실제로 N
보다는 A
될 것이라고 믿고있어 감안할 때 그렇지 않으면 DDDDD
과 AAAA
부분 사이에 단색 경계가 없기 때문입니다.
문자열이 실제로 NNDDDDDNAAA
인 것처럼 보이며 NAAA
부분을 공백으로 바꿔야합니다. 이것을 감안할 때 정규 표현식은 다음과 같이 재 작성 될 수 있습니다. (\\D+\\d+)(\\D.+)
Java의 확실한 lookbehind에는 고정 길이 패턴이 필요합니다. +
또는 *
패턴을 사용할 수 없습니다. 대신 중괄호를 사용하고 최대 길이를 지정할 수 있습니다. 예를 들어, 각 +
대신에 {1,9}
을 사용할 수 있으며, 1 ~ 9 문자와 일치합니다 (?<=\\D{1,9}\\d{1,9})(\\D.+)
여기에 유일한 문제는 당신이 그렇게됩니다 "NNNDDDDNAAA".replaceAll("(?<=\\D{1,9}\\d{1,9})(\\D.+)", " ")
를 사용하여 단일 경기로 NAAA 순서와 일치하고있다 전체 NAAA
시퀀스를 여러 공백이 아닌 단일 공백으로 대체하십시오.
일치 항목의 시작 구분 기호와 문자열 길이를 사용하여 올바른 공백 수를 추가 할 수 있지만 그 지점은 표시되지 않습니다. 나는 당신이 원래의 솔루션으로 더 나아 졌다고 생각합니다. 간단하고 쉽게 따라 할 수 있습니다.
좀 더 빠른 속도를 찾고 있다면 함수 외부에서 패턴을 컴파일하고 StringBuilder 또는 StringBuffer를 사용하여 출력을 생성 할 수 있습니다. 이 모든 NNDDDDDAAAAA 요소에서 큰 String을 작성하는 경우, 추가를 완료 할 때까지 StringBuilder에서 완전히 작업하십시오.
class Test {
public static Pattern p = Pattern.compile("(\\D+\\d+)(\\D.+)");
public static StringBuffer replace(String input) {
StringBuffer output = new StringBuffer();
Matcher m = Test.p.matcher(input);
if(m.matches())
output.append(m.group(1)).append(m.group(2).replaceAll("."," "));
return output;
}
public static void main(String[] args) {
String input = args[0];
long startTime;
StringBuffer tests = new StringBuffer();
startTime = System.currentTimeMillis();
for(int i = 0; i < 50; i++)
{
tests.append("Input -> Output: '");
tests.append(input);
tests.append("' -> '");
tests.append(Test.replace(input));
tests.append("'\n");
}
System.out.println(tests.toString());
System.out.println("\n" + (System.currentTimeMillis()-startTime));
}
}
는 업데이트 : 나는 빠른 반복적 인 솔루션을 쓰고, 모두를 통해 어떤 임의의 데이터를 달렸다. 반복적 인 솔루션은 약 4-5 배 빠릅니다.
public static StringBuffer replace(String input)
{
StringBuffer output = new StringBuffer();
boolean second = false, third = false;
for(int i = 0; i < input.length(); i++)
{
if(!second && Character.isDigit(input.charAt(i)))
second = true;
if(second && !third && Character.isLetter(input.charAt(i)))
third = true;
if(second && third)
output.append(' ');
else
output.append(input.charAt(i));
}
return output;
}
'A'와 다른 것의 차이점은 무엇이라고 생각하십니까? 'A'는 항상 'D'다음에 오는거야? – BryanH
마지막 "D"와 첫 번째 "A"의 차이점은 무엇입니까? "A"그룹이 "D"유형 문자가 아니란 보장이 있습니까? –
Curtis Tasker가 정확합니다. NNDDDD가 항상 N이면 나머지는 아무것도 아닙니다. –