2012-07-19 49 views
3

我在使用java.util.regex的模式匹配器獲取一些正則表達式來工作時遇到了問題。我有以下表現:正則表達式在rubular中匹配,而不是在java中

(?=^.{1,6}$)(?=^\d{1,5}(,\d{1,3})?$) 

我測試對下列字符串匹配:

12345 (match OK) 
123456 (no match) 
123,12 (match OK) 

當我測試它在以下網站似乎很好地工作:

http://rubular.com,OK

http://www.regextester.com/,ok

http://myregextester.com/index.php,好吧

但是我似乎無法得到它匹配我的Java程序中的任何東西。此外,在線java正則表達式測試儀給出相同的結果(不匹配):

http://www.regexplanet.com/advanced/java/index.html沒有匹配???

我沒有線索爲什麼我不能得到這個工作在Java中,但似乎在很多其他正則表達式引擎工作?

編輯:這是非工作代碼。原諒打字錯誤,我不能複製/粘貼從我的代碼PC到stackoverflow。

String inputStr = "12345"; 
String pattern = "(?=^.{1,6}$)(?=^\\d{1,5}(,\\d{1,3})?$)"; 
Pattern regexp = Pattern.compile(pattern); 
System.out.println("Matches? "+regexp.matcher(inputStr).matches()); 
System.out.println(inputStr.matches(pattern)); 
+2

你在Java中使用什麼方法進行匹配? – Joey 2012-07-19 09:12:09

+0

請用Java顯示你的(非工作)代碼。 – nhahtdh 2012-07-19 09:14:54

+0

你能告訴我們你想要匹配什麼,並提供你正在使用這個正則表達式的Java代碼嗎? – Lopina 2012-07-19 09:17:55

回答

2

首先,您需要跳過\ s的模式。然後,如果您使用matches(),Java會嘗試匹配整個字符串,所以它將返回false,除非您刪除第二個前瞻或在末尾添加.*

這將產生在Java中右輸出:

String regex = "(?=^.{1,6}$)^\\d{1,5}(,\\d{1,3})?$"; 
    System.out.println("12345".matches(regex)); 
    System.out.println("123456".matches(regex)); 
    System.out.println("123,12".matches(regex)); 

所以做這個表達式:

String regex = "(?=^.{1,6}$)(?=^\\d{1,5}(,\\d{1,3})?$).*"; 
1

工具之間的差異,在一個情況下,它會嘗試找到一個匹配另一個它試圖匹配整個字符串。如果在java中使用string.matches(regex),那麼對於所有輸入,這將返回false,因爲您不會將整個字符串與您的先行表達式匹配。要麼你追加一個.*作爲Keppil建議,或者您使用的匹配器類:

Pattern p = Pattern.compile(regex); 
Matcher matcher = p.matcher(text); 
if(matcher.find()) { 
    System.out.println("Match found"); 
} 
1

它的正常工作。您可能正在使用matches()方法,該方法預計正則表達式匹配並消耗整個字符串。你的正則表達式不會消耗任何東西,因爲它只是一些lookahead。在RegexPlanet站點上,查看find()列,您將看到您期望的結果。在您的Java代碼中,您必須創建一個Matcher對象,以便您可以使用其find()方法。

+0

感謝所有人,問題似乎如上所述,不同的人用不同的文字說明了什麼都沒有消耗。在正則表達式字符串的末尾添加。*可修復所有內容。 爲了完整起見,我在代碼中添加了幾行代碼。猜猜我需要多讀一點,並更新我對這部分正則表達式的知識! – Martijn 2012-07-19 10:24:14