[英]RegEx pattern two letters or digits followed by digits
你能幫我建立正確的正則表達式嗎? 它應該是 2 個字母或數字后跟數字。
These would be valid:
AA00
AB12
A123
1234
These would not
1DAA
D1D2
DDDD
這是我的代碼示例
public void installFilterOnlyNumberAndLetters(final TextField tf) {
tf.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
if (newValue != null && !newValue.matches("(([A-Z][A-Z0-9])||([A-Z][A-Z])|(|\\d\\d))\\d+")) {
tf.setText(newValue.replaceAll("[^(([a-z][a-z0-9])||([a-z][a-z])|(|\\d\\d))\\d+]", ""));
}
}
});
}
你的心態在這里有問題。
您要求:如果輸入無效,請清除輸入。
這是有問題的; 如果沒有“通過”無效輸入,就不可能得到有效輸入。
假設我要輸入有效的 AA00。
我單擊您的文本框,輸入“A”,然后我的 A 立即消失。 畢竟,“A”是無效的。
即使您嘗試通過允許單個字符來解決此問題,或者通過“單個字母或數字也有效”來調整“有效內容”的規則,您現在創建的內容也令人難以置信。 如果我從其他地方粘貼一個 ID,而我的 ID 以空格開頭,那么我認為我的電腦壞了:我粘貼“AA00”,我的文字就消失了。
這不是您構建良好用戶界面的方式。
這是一種替代方法,同樣簡單:
您添加一個更改的偵聽器。 您檢查輸入。 如果輸入有效,則將輸入元素的背景着色為淺綠色。 如果輸入為空,則將其着色為默認背景顏色。 否則,給它一個紅色調。
現在,當我鍵入 ID 時,我會得到視覺反饋。
經驗法則相當簡單:除非你真的、真的知道你在做什么,否則不要亂用用戶的輸入。
您創建了一個非常復雜的正則表達式。 這個簡單的將完全涵蓋您要求的內容:2 個字符,可以是字母或數字,后跟任意數量的數字:
Pattern.compile("^[a-zA-Z0-9]{2}[0-9]*$")
是你所需要的全部。 它甚至讀起來就像你問的那樣:“2 個字母/數字”,然后是“任意數量的數字”。
假設以下最小大小為 4 - 可以根據需要更改
public static final String C2_PRE_STR = "([a-zA-Z]{2}|\\d{2})\\d{2,}";
public static void main(String[] args) {
List<String> valids = List.of("AA00", "AB123", "AA2345", "1234", "12345");
List<String> invalids = List.of("1DAA", "D1D2", "DDDD", "A1", "11");
System.out.printf("%10s %10s %10s %10s\n", "input", "expected", "actual", "matching?");
valids.forEach(s -> System.out.printf("%10s %10s %10s %b\n", s, s, validatedValue(s), s.matches(C2_PRE_STR)));
invalids.forEach(s -> System.out.printf("%10s %10s %10s %b\n", s, "", validatedValue(s), s.matches(C2_PRE_STR)));
}
private static String validatedValue(String input) {
return input.matches(C2_PRE_STR) ? input : "";
}
在下面產生
> Task :RegEx.main()
input expected actual matching?
AA00 AA00 AA00 true
AB123 AB123 AB123 true
AA2345 AA2345 AA2345 true
1234 1234 1234 true
12345 12345 12345 true
1DAA false
D1D2 false
DDDD false
A1 false
11 false
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.