簡體   English   中英

在 Android 上使用正則表達式實現部分匹配時遇到問題

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

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