2013-05-31 23 views
4

我有一個使用正則表達式發送給它並使用它從字符串檢索值的服務運行。Java正則表達式:後面的組沒有「明顯的最大長度」

我可以在類中創建一個主要的方法,並調試正則表達式(?<=\\().+?(?=\\){1}),它的工作原理是完美的。

但是,只要我在Tomcat中部署遠程測試,我得到以下異常:

Look-behind group does not have an obvious maximum length near index 19 
(?<=\\().+?(?=\\){1}) 
       ^

下面是解析出一個正被調用值的函數:

private String parsePattern(String value, String pattern) 
{ 
    String ret = ""; 

    Matcher m = Pattern.compile(pattern).matcher(value); 
    while (m.find()) 
    { 
     ret = m.group(0); 
    } 

    return ret; 
} 

這是怎麼回事,導致它在應用程序中編譯,但不能在webapp中工作?

編輯:

此失敗,任意字符串,但目前被檢查的字符串是:「(集團營改造)」

當從main調用,則該方法返回「組營改造」的時候,通過webapp調用,它引發異常。

+0

'''Pattern.compile()'從主方法運行時可以完美地使用相同的正則表達式。我知道這是一個運行時異常,我想知道爲什麼它只在某些情況下拋出。 – cxdf

+1

我希望你沒有使用'{1}',這只是你真正擁有的一個壞例子 – HamZa

+0

Pattern.compile()將不起作用,除非我添加了{1} – cxdf

回答

7

問題是 - 再一次引用Java代碼中的字符串,而不是在通過某種輸入讀取時引用。

當粘貼的串(?<=\\().+?(?=\\){1})這樣的:

String s1 = "(?<=\\().+?(?=\\){1})"; 
System.out.println(s1); 

你會得到這樣的輸出

(?<=\().+?(?=\){1}) 

,這是正則表達式解析器看到什麼。

但是,當通過InputStream(就像一個例子)被讀取相同的字符串,沒有什麼改變:

String s1 = new BufferedReader(new InputStreamReader(System.in)).readLine(); 
System.out.println(s1); 

將打印

(?<=\\().+?(?=\\){1}) 

這意味着,{1}歸因於(?=\\)部分而不是(?<=部分。

+0

+1美麗的答案:)我有這個問題的盲點,並自動加倍反斜槓在我的例子中,沒有想到確切的,這可能是令人不安的OP。 –

+0

收到您的答案正確,因爲我自己想出來。謝謝。 :) – cxdf

1

我已經進入你的模式爲ideone,結果是一樣的你的Tomcat的結果:

System.out.println("aoeu".matches("(?<=\\\\().+?(?=\\\\){1})")); 

注意我如何一倍所有的反斜線的字符串字面,纔能有Pattern.compile接收你有錯誤信息中的字符串。

相關問題