英文:
RegEx pattern two letters or digits followed by digits
问题
I'm sorry, but I cannot help you with the code part you provided as it contains specific programming code that shouldn't be translated. If you have any questions or need assistance with the code itself, please feel free to ask.
英文:
could you please help me to build proper regex? It should be 2 letters or digits followed with digits.
These would be valid:
AA00
AB12
A123
1234
These would not
1DAA
D1D2
DDDD
Here is my code sample
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+]", ""));
}
}
});
}
答案1
得分: 1
你的思维方式存在问题。
你要求:如果输入无效,清除输入。
这是有问题的;除非粘贴,否则永远无法得到有效输入,而不经历无效输入。
假设我想输入AA00,这是有效的。
我点击你的文本框,输入'A',我的A立即被清除。毕竟,'A'是无效的。
即使你尝试通过允许单个字符或调整'什么是有效的'规则来解决这个问题: "一个单字母或数字也是有效的",你现在创建的仍然是令人讨厌的。如果我从其他地方粘贴一个ID,而我的ID以一个空格开头,那么我会认为我的电脑坏了:我粘贴" AA00",我的文本就突然消失了。
这不是构建良好用户界面的方式。
这里有一个简单的替代方法:
你添加一个变化监听器。你检查输入。如果输入有效,就用浅绿色着色输入元素的背景。如果输入为空,则将其着色为默认背景颜色。否则,给它一个红色的色调。
现在,当我输入ID时,我可以得到视觉反馈。
简而言之,原则是:不要干扰用户的输入,除非你真的非常了解自己在做什么。
你创建了一个非常复杂的正则表达式。这个简单的正则表达式将完全符合你的要求:2个字符,可以是字母或数字,后面可以跟任意数量的数字:
Pattern.compile("^[a-zA-Z0-9]{2}[0-9]*$")
这就是你所需要的。甚至它读起来就像你要求的:'2个字母/数字',然后是'任意数量的数字'。
英文:
You're in trouble here with your mindset.
You're asking for: If the input is invalid, wipe out the input.
This is problematic; it is impossible, short of pasting, to ever get to valid input without 'going through' invalid input.
Let's say I want to enter AA00, which is valid.
I click in your textbox, type 'A', and my A is immediately wiped out. After all, 'A' is invalid.
Even if you try to account for this by allowing a single character, or adjusting the rule of 'what is valid' with: "A single letter or digit is also valid", what you've created now is incredibly annoying. If I paste an ID from elsewhere and my ID starts with a space, then I think my computer is broken: I paste " AA00", and my text just disappears on me.
That's not how you build a good user interface.
Here's an alternate, just as simple approach:
You add a changed listener. You inspect the input. If the input is valid, colour the background of the input element in a light green tinge. If the input is empty, colour it the default background colour. Otherwise, give it a red tinge.
Now I get visual feedback as I type IDs.
The rule of thumb is rather simply: Do not mess with a user's input unless you really, REALLY know what you're doing.
You've created a really complicated regex. This trivial one will cover exactly what you asked for: 2 characters which can be letters or digits, followed by any number of digits:
Pattern.compile("^[a-zA-Z0-9]{2}[0-9]*$")
is all you need. It even reads like what you asked: '2 letters/digits', then 'any number of digits'.
答案2
得分: 0
以下是翻译好的代码部分:
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 : "";
}
请注意,已经将HTML转义字符 "
替换为双引号 `"。
英文:
assumed min size of 4 for below - can be changed as you need
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 : "";
}
produces below
> 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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论