2012-11-27 3 views
3

이 정규식 "((\\-)?[0-9]+(.([0-9])+)?)+"은 각각 하나의 공백으로 구분 된 일련의 숫자와 일치해야합니다. 예 : "5 4 1 2 2.4 3 7.8"또는 "5 4 1 2 2.4 8.001 7.8". 나는 위의 예처럼이 작은 문자열을 줄 때긴 문자열을 정규식과 일치시키는 방법은 무엇입니까?

if((value+" ").matches("((\\-)?[0-9]+(.([0-9])+)?)+")){ 
    // anything 
} 

건은, 그것은 완벽하게 간다 : 문자열이 내가 할 정규식과 일치하는 경우 위해서는

확인합니다. 하지만 긴 문자열의 경우 : "2000000 2000000 2000000 2000000 2000000 2000000 2000000 2000000"일치하는 경우 완벽하게 진행되지만 일치하지 않으면 최대 5 초가 걸립니다. 이것을 확인하십시오 :

String value = "2000000 2000000 2000000 2000000 2000000 2000000 2000000 2000000 h"; 

System.out.println("Start: "+System.currentTimeMillis()); 
if((value+" ").matches("((\\-)?[0-9]+(.([0-9])+)?)+")){ 
    System.out.println("OK"); 
}else{ 
    System.out.println("NOK"); 
} 
System.out.println("End: "+System.currentTimeMillis()); 

이것은 최대 5 초가 걸립니다 !! 문자열의 끝에서 "h"를 제거하면 1ms 미만이 걸릴 것입니다.

아이디어가 있으십니까?

+4

도트를 이스케이프 처리하는 것이 좋습니다. – jlordo

답변

1

먼저 당신은 당신의 정규식을 수정해야합니다. 어쩌면 이것은 성능을 떨어 뜨릴 수 있습니다.

그런 다음 먼저 임의의 문자를 찾으려고 할 수 있으며, 발견되면 정규식으로 확인하거나 누군가가 이전에 말한 것처럼 작은 조각으로 나눠서 확인하지 마십시오.

+0

와우 .. 그게 다 :) 매력처럼 작동했다. Thnx –

3

위의 숫자를 공백으로 나누어서 나누고 각 부분 문자열에 간단한 정규 표현식을 적용하면 을 훨씬 더 빨리 얻을 수 있다고 생각됩니다. 버전은 공간을 포함하는 두 숫자 사이의 기호에 맞게

"((\\-)?[0-9]+(\\.([0-9])+)?)+" 

때문에 :

+0

음, 똑똑한 해결 방법이 될 것 같지만 만약 내가 무슨 뜻인지 안다면 해결책이 될거야. –

관련 문제