[英]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://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.