[英]Trouble implementing partial matches with regular expression on Android
我正在創建一個正則表達式來評估 IP 地址是否是有效的多播地址。 此驗證在您鍵入時實時發生(如果您鍵入無效/超出范圍的字符,則不接受),因此我不能簡單地根據正則表達式評估最終結果。 我遇到的問題是它允許在每組數字之后有一個雙句點(224..、224.0..、224.0.0.. 都顯示為有效)。
下面的代碼是 static 表示正在發生的事情。 不知何故 224.. 顯示為合法值。 我已經在線測試了這個正則表達式(非 java 化:^2(2[4-9]|3\d)(.(25[0-5]|2[0-4]\d|1\d \d|[1-9]\d|\d)){3}$ ) 並且它完美地工作並且不接受我正在描述的無效輸入。
Pattern p = Pattern.compile("^2(2[4-9]|3\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}$");
Matcher m = p.matcher("224..");
if (!m.matches() && !m.hitEnd()) {
System.out.println("Invalid");
} else {
System.out.println("Valid");
}
似乎每當我輸入 224.. 時,方法 m.hitEnd() 的評估結果為真,這對我來說沒有意義。 如果有人可以檢查一下並確保我沒有犯任何明顯的錯誤,也許可以解釋為什么 hitEnd() 在這種情況下返回 true,我會很感激。 感謝大家。
在對自己進行了一些評估之后(發現這是在 Android 上),我意識到相同的代碼在 Dalvik 上的響應與在常規 JVM 上的響應不同。
代碼是:
Pattern p = Pattern.compile("^2(2[4-9]|3\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}$");
Matcher m = p.matcher("224..");
if (!m.matches() && !m.hitEnd()) {
System.out.println("Invalid");
} else {
System.out.println("Valid");
}
此代碼(盡管稍作修改)在 Android 上打印 Valid,在 JVM 上打印無效。
我不知道你是如何測試你的正則表達式的,但根據你的描述它看起來不正確。
您的正則表達式需要所有 4 個數字部分。 它不可能匹配 224.. 只有 [0-1] 和 \d 標有問號,因此是可選的。
因此,在不處理允許特定數字限制的細節的情況下,我建議您這樣做:
^\\d{1-3}\\.(\\d{0-3}\\.)?(\\d{0-3}\\.)?(\\d{0-3}\\.)?$
而且你不必使用 hitEnd(): $ 最后就足夠了。 並且不要使用matches()
。 請改用find()
。 matches()
與find()
類似,但會自動添加 ^ 和 $。
我剛剛測試了您的代碼,並且m.hitEnd()
對我的評估結果為 false,並且我收到無效...
所以我不確定這里的問題是什么?
我在 Dalvik 中報告了錯誤 20625 。 在此期間,您不需要使用hitEnd()
,具有$
后綴就足夠了。
public void testHitEnd() {
String text = "b";
String pattern = "^aa$";
Matcher matcher = Pattern.compile(pattern).matcher(text);
assertFalse(matcher.matches());
assertFalse(matcher.hitEnd());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.