通过使用正则表达式,我尝试在用户键入时验证用户输入。
我的模式是这样的:“(\\w{3})(\\d{7})(\\w{3})”。
有效输入可以是“XYZ0001112CCC”
。
我想将其验证为用户类型。我的意思是 "A", "AB", "ABC", "ABC12", "ABC123", ..., "ABC1234567XY"
也不应该失败。但是 "A1", "AB2", "ABCD123", ..., "ABC1234567XY1"
一定会失败。只要输入不违反规则,我想假设它“到目前为止有效”。这可以通过正则表达式实现吗?
最佳答案
我将使用“一次或根本不”量词的组合来表示第一个字母之后的每个后续部分,并使用后视来验证输入的先前部分。
例如:
// |first letters (1 to 3)
// | if 3 letters precede...
// | digits (1 to 7)
// | if 7 digits precede...
// | 3 letters
Pattern p = Pattern.compile("[a-zA-Z]{1,3}((?<=[a-zA-Z]{3})\\d{1,7})?((?<=\\d{7})[a-zA-Z]{3})?");
String[] inputs = {"XYZ0001112CCC", "A", "AB", "ABC", "ABC12", "ABC123", "A1", "AB2", "ABCD123","ABC1234567XY1"};
Matcher m;
for (String input: inputs) {
m = p.matcher(input);
System.out.println("Input: " + input + " --> Matches? " + m.matches());
}
输出:
Input: XYZ0001112CCC --> Matches? true
Input: A --> Matches? true
Input: AB --> Matches? true
Input: ABC --> Matches? true
Input: ABC12 --> Matches? true
Input: ABC123 --> Matches? true
Input: A1 --> Matches? false
Input: AB2 --> Matches? false
Input: ABCD123 --> Matches? false
Input: ABC1234567XY1 --> Matches? false
注意
我已将您的 \\w
表达式更改为字符类 [a-zA-Z]
,因为 \\w
也验证数字。
[a-zA-Z]
的替代方案是:
\\p{Alpha}
[a-z]
带有Pattern.CASE_INSENSITIVE
标志
最后说明
我的Pattern
将最后一个字母作为一个 3 字母组。
如果您还接受 1 或 2 个字母,则只需将最后一个量词表达式 {3}
更改为 {1,3}
。
关于java正则表达式输入比模式短,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19589626/