簡體   English   中英

我需要在焦點丟失事件中驗證 NIC

[英]I need to validate NIC in focus lost event

我需要在焦點丟失事件中驗證 NIC。我使用了此代碼。 即使我提供了正確的 NIC,它也不適用於它打印 Invalid NIC 消息的所有情況。 任何人都可以說代碼中是否有問題並告訴我代碼中更正位置的指南。

if(!(txtNic.getText().matches("/^[0-9]{9}[vVxX]$/")))
{
    JOptionPane.showMessageDialog(null,"Invalid NIC ");
}           

您的正則表達式中不需要周圍的斜線:

if(!(txtNic.getText().trim().matches("^[0-9]{9}[vVxX]$")))
{
    JOptionPane.showMessageDialog(null,"Invalid NIC ");
}

應該管用。 我還添加了 .trim() 以確保我們沒有放入任何可能進入的空格。

regex的缺點之一是不了解其模式語法( Java 模式參考)。

讓我們分解您使用的模式:

"/^[0-9]{9}[vVxX]$/"
  • /^ - 文字字符串
  • [0-9]{9} - 數字 0-9 重復 9 次的字符類
  • [vVxX] - 字符 v、V、x 和 X 的字符類
  • $/ - 文字字符串

那么 927173024v 是否匹配該模式? 不,它沒有。 它不以"/^"開頭,也不以"$/"結尾

正如@TomElliot 的回答所示,您不希望在您的模式中使用正斜杠:

"^[0-9]{9}[vVxX]$"

現在我們有一個細分:

  • ^ - 表示一行的開始
  • [0-9]{9} - 數字 0-9 重復 9 次的字符類
  • [vVxX] - 字符 v、V、x 和 X 的字符類
  • $ - 表示一行的結束。

現在 927173024v 匹配模式並且將被標記為有效。

選擇

根據您要驗證的數據負載,“有時”手動檢查比正則表達式更容易理解並且執行速度更快(更多代碼並不意味着更慢的性能)。

您的正則表達式模式包含以下規則:

  • 長度必須為 10 個字符
  • 前 9 個字符必須是數字
  • 最后一個字符必須是 av, V, x, OR X

使用這些規則“CAN”進行驗證的自定義方法更容易理解並且“IS”更快regex 在這種情況下,如何驗證 NIC 似乎並不重要,但這里有一個示例方法可以驗證它。

public static boolean validateNIC(String nic) {
    // Check if length is 10
    int length = nic.length();
    if (length != 10) {
        return false;
    }

    // Check last character for v, V, x, or X
    char lastChar = nic.charAt(length - 1);
    if (lastChar != 'v' || lastChar != 'V' || 
        lastChar != 'x' || lastChar != 'X') {
        return false;
    }

    // Check first 9 characters are digits
    for (int i = 0; i < length - 2; i++) {
        char currentChar = nic.charAt(i);
        if (currentChar < '0' || '9' < currentChar) {
            return false;
        }
    }

    return true;
}

有兩種類型的網卡號碼 新網卡只有 12 位號碼組合,舊網卡有 9 位號碼與 X、V 或 x、v 組合。 因此,必須分別檢查所有類型。

用於舊網卡驗證

public static boolean validateNICOld(String nic) {
    int length = nic.length();
    if (length != 10) {
        return false;
    } else {
        char lastChar = nic.charAt(length - 1);
        String lastCharacter = String.valueOf(lastChar);
        if (lastCharacter.equalsIgnoreCase("v") || lastCharacter.equalsIgnoreCase("x")) {
            String number = nic.substring(0, length - 1);
            Log.d("NUmber", number);
            if (!number.trim().matches("/^[0-9]{9}/")) {
                return true;
            } else {
                return false;
            }
        } else {
            for (int i = 0; i < length - 2; i++) {
                char currentChar = nic.charAt(i);
                if (currentChar < '0' || '9' < currentChar) {
                    return false;
                }
            }
        }
    }
    return false;
}

用於新 NIC 驗證

public static boolean validateNICNew(String nic) {
    int length = nic.length();
    if (length != 12) {
        return false;
    } else {
        Log.d("NIC", nic);
        if (!nic.trim().matches("/[0-9]{12}/")) {
            return true;
        } else {
            return false;
        }
    }
}

嘗試這個

public class NICController {

@FXML
private TextField txtTele;

@FXML
private void clickValidation(ActionEvent actionEvent) {
    if (isValidNIC(txtTele.getText())) {
        new Alert(Alert.AlertType.CONFIRMATION, "Valid Nic", ButtonType.OK).showAndWait();
        txtTele.clear();
        txtTele.requestFocus();
    } else {
        new Alert(Alert.AlertType.ERROR, "Invalid NIC", ButtonType.OK).showAndWait();
        txtTele.requestFocus();
    }
}

private boolean isValidNIC(String input) {
    return input.matches("\\d{9}[Vv]");
}

}

暫無
暫無

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

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