[英]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 匹配模式並且將被標記為有效。
根據您要驗證的數據負載,“有時”手動檢查比正則表達式更容易理解並且執行速度更快(更多代碼並不意味着更慢的性能)。
您的正則表達式模式包含以下規則:
使用這些規則“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.