簡體   English   中英

正則表達式在rubular中匹配,而不是在java中

[英]regex matches in rubular, not in java

我在使用java.util.regex的模式匹配器獲取一些正則表達式時遇到了問題。 我有以下表達式:

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

我測試匹配以下字符串:

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

當我在以下網站上測試它似乎完美地工作:

http://rubular.com ,好的

http://www.regextester.com/ ,好的

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));

首先,您需要在模式中轉義\\ 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})?$).*";

這些工具之間的區別在於,在一種情況下,它試圖在另一種情況下找到匹配,它試圖匹配整個字符串。 如果在java中使用string.matches(regex),則對於所有輸入都將返回false,因為整個字符串與前瞻表達式不匹配。 您可以附加.*作為Keppil建議,或者您使用Matcher類:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM