1

通过使用正则表达式,我试图在用户输入时验证他的输入。

我的模式是这样的:"(\\w{3})(\\d{7})(\\w{3})". 一个有效的输入可以是"XYZ0001112CCC".

我想将其验证为用户类型。我的意思是"A", "AB", "ABC", "ABC12", "ABC123", ..., "ABC1234567XY"也不应该失败。但"A1", "AB2", "ABCD123", ..., "ABC1234567XY1"必须失败。只要输入不违反规则,我想假设它“到目前为止有效”。这可以用正则表达式吗?

4

4 回答 4

1

您可以将模式更改为更简单的模式([a-zA-Z]+)(\d+)([a-zA-Z]+)

然后您可以检查每组中有多少个字母:

Pattern p = Pattern.compile("([a-zA-Z]+)(\d+)([a-zA-Z]+)");
Matcher matcher = p.matcher("ABC1234567XYZ");
if (matcher.find()) {
    String firstLetters = matcher.group(1);
    String digits = matcher.group(2);
    String lastLetters = matcher.group(3);

    //any checks here
}
于 2013-10-25T12:30:54.417 回答
1

我会在第一个字母之后的每个后续部分使用“一次或根本不”量词的组合,并向后看以验证输入的前面部分。

例如:

//                           |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旗子

最后说明

MyPattern将最后一个字母作为一个 3 字母组。如果您还接受 1 或 2 个字母,则只需将最后一个量词表达式更改{3}{1,3}.

于 2013-10-25T12:34:00.593 回答
0

我建议您将验证拆分为两个单独的正则表达式:一个用于目前有效的验证,另一个用于最终检查。

即便如此,验证例如ABC1到目前为止是否有效也不是一件容易的事。像这样的模式(\\w{0,3})(\\d{0,7})(\\w{0,3})不会削减它,因为X0C会被错误地认为是有效的。因此,我建议您不要尝试仅使用正则表达式来解决此问题,而应使用一些编码逻辑。

(可以使用lookbehindsif-then-else 条件将所有验证逻辑压缩到单个正则表达式中,但我建议不要这样做。它不可读且不可维护。)

于 2013-10-25T12:29:29.147 回答
0

由于格式相当简单,你可以做这样的事情(我不知道确切的 java 语法,但我认为这个想法很清楚):

String input = "DEF3";
String example = "ABC1234567XY";
Pattern regex = Pattern.compile("(\\w{3})(\\d{7})(\\w{3})");

String test_input = input + example.last_digits(example.length-input.length);
Matcher matcher = p.matcher(test_input);
return matcher.find();

这样,您唯一的重复是在示例和正则表达式之间。

于 2013-10-25T13:06:43.187 回答