2010-04-02 2 views
1

안드로이드 애플 리케이션에서 나는 2 regEx의 문자열을 구문 분석하는 데 사용하는 유틸리티 클래스가 있습니다. 정적 이니셜 라이저에서 두 패턴을 컴파일하여 한 번만 컴파일 한 다음 활동에서 파싱 메소드를 정적으로 사용할 수 있습니다.Android 앱에서 java.util.regex 사용 -이 문제가 있습니까?

클래스가 액세스되어로드되고 정적 초기화 프로그램이 패턴을 컴파일 할 때 UI가 패턴을 컴파일하는 동안 MINUTE에 가깝게 정지한다는 점을 제외하고는 정상적으로 작동합니다! 처음 후에는 parseString()에 대한 모든 후속 호출에서 작동합니다.

내가 사용하고있는 regEx는 다소 큰 847 자이지만 일반적인 java webapp에서는 번개처럼 빠르게 발생합니다. 지금까지 1.5 AVD로 에뮬레이터에서만 이것을 테스트하고 있습니다.

이 문제는 에뮬레이터 문제 일 수 있습니까? 아니면이 패턴이 너무 오래 컴파일되는 다른 이유가있을 수 있습니까?

private static final String exp1 = "(insertratherlong---847character--regexhere)"; 
private static Pattern regex1 = null; 

private static final String newLineAndTagsExp = "[<>\\s]"; 
private static Pattern regexNewLineAndTags = null; 

static { 
    regex1 = Pattern.compile(exp1, Pattern.CASE_INSENSITIVE); 
    regexNewLineAndTags = Pattern.compile(newLineAndTagsExp); 
} 
public static String parseString(CharSequence inputStr) { 

    String replacementStr = "replaceMentText"; 
    String resultString = "none"; 
    try { 
     Matcher regexMatcher = regex1.matcher(inputStr); 
     try { 
      resultString = regexMatcher.replaceAll(replacementStr); 
     } catch (IllegalArgumentException ex) { 


     } catch (IndexOutOfBoundsException ex) { 


     } 
    } catch (PatternSyntaxException ex) { 

    } 

    return resultString; 
} 

답변

0

디버깅으로 시작한 경우 일반 출시보다 약 2 배 느릴 것으로 예상 할 수 있습니다. 그러나 1 분은 특별한 것처럼 보입니다. 제안 할 몇 가지 사항은, i. 콘솔 출력을보고 경고가 스팟 아웃되고 있는지 확인 ii. 컴파일 할 때 디버거에서 '일시 중지'를 눌러서 무엇을하는지 볼 수 있습니다. 소스를 가져 오는 방법이 있지만 호출 스택을보고도 무언가를 알 수 있습니다.

2

재생 가능한 테스트 사례를 http://code.google.com/p/android/issues/entry에 보내 주시면 자세히 살펴 보겠습니다. 문제를 재현하는 정규 표현식이 필요할 것입니다. (우리의 정규식은 ICU4C에 의해 구현되기 때문에 컴파일은 실제로 네이티브 코드에서 발생하므로 ICU 버그가 될 수 있습니다. 그러나 안드로이드 버그를 신고하면 업스트림에 대해 걱정할 것입니다.)

+0

java.util.regex.Pattern 클래스는 ICU4C를 사용하고 있습니까? 그렇다면 \ U0002A700- \ U0002B73F (또는 유사한 \ U 표현식)이 작동하지 않는 이유는 무엇입니까? –

+0

예, 모든 패턴 및 매처에는 icu4c에서 제공하는 원시 피어가 있습니다. 특정 버그가있는 경우 재현 가능한 테스트 케이스로 버그 추적기에보고하십시오. –

관련 문제