2010-04-02 49 views
1

在Android應用程序中,我有一個實用程序類,用於解析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

如果您在調試過程中啓動,則預計它會比正常啓動慢兩倍。然而,一分鐘似乎非同尋常。有些事情建議,我。看看控制檯的輸出,看看警告是否吐出來,ii。當它在進行編譯時,在調試器中按'暫停',看看它在做什麼。有許多方法可以獲得源代碼,但即使如此,只要查看調用堆棧,也可能會發現一些問題。

2

請在http://code.google.com/p/android/issues/entry提交可複製的測試案例,我會看看。請注意,我需要一個能夠重現問題的正則表達式。 (我們的正則表達式是由ICU4C實現的,所以編譯實際上是在本地代碼中發生的,這可能最終會成爲ICU的一個錯誤,但是如果您提交Android錯誤,我會擔心上游。)

+0

您的意思是java.util.regex.Pattern類在引擎蓋下使用ICU4C?如果是這樣,爲什麼\ U0002A700- \ U0002B73F(或類似的\ U表達式)不起作用? – 2011-08-25 10:22:35

+0

是的,每個模式和匹配器都有一個由icu4c提供的本地對等體。如果您有特定的錯誤需要報告,請通過可重現的測試用例向錯誤跟蹤器報告。 – 2012-01-22 23:07:50

相關問題