【问题标题】:Bean validation regex for an input string containing x or y number of digits包含 x 或 y 位数的输入字符串的 Bean 验证正则表达式
【发布时间】:2016-10-03 08:07:38
【问题描述】:

我想检查输入字符串是否包含 x 或 y 位数。我正在使用JSR-303 bean 验证。是否可以检查?如果是的话,什么正则表达式是合适的?为了。例如。 “123dfn5657”或“34fdg8959413”如果针对“^(\d{7}|\d{9})$”之类的内容进行验证应该是有效的。

【问题讨论】:

  • 您将“数字”称为“字符”,还是字母的数字?
  • @RamónGilMoreno 在上面的问题中,字符串“123dfn5657”中存在的总位数为 - 7。所以一个数字只是输入字符串中的一个字符。
  • 您对问题的初始描述具有误导性,因为您想过滤输入中的任何字母并仅保留数字/数字。下次请更具体地描述您的描述。我已经更新了我的答案以跳过字母,同时计算您输入中的数字/数字/0-9 的总数。

标签: java regex validation bean-validation


【解决方案1】:

您可以使用java.util.regex.Pattern javadoc 中描述的正则表达式语法。

在您的情况下,例如,假设您想要定义 1、2 或 4 位(但不是 3 位)的输入,您可以使用如下结构:

String[] samples = { 
    "1",
    "12",
    "1234",
    "123",
    "123a",
    "1a234",
    "a1234b",
    "a1bcd2e",
    "a1bcd2e3",
    "a1bde2e34"
};
for (String s: samples) {
    System.out.println(s + "\t" +
            java.util.regex.Pattern.matches("(([a-z]*\\d){1}|([a-z]*\\d){2}|([a-z]*\\d){4})[a-z]*", s));
}

输出将是:

1         true
12        true
1234      true
123       false
123a      false
1a234     true
a1234b    true
a1bcd2e   true
a1bcd2e3  false
a1bde2e34 true

【讨论】:

  • 感谢您的回答。我正在使用 bean 验证的javax.validation.constraints.Pattern。我尝试了@Pattern(regexp = "\\d{5} | \\d{6}")。但这似乎不起作用。而不是 \\d 多次我想指定更容易的长度。
  • 我认为你的正则表达式中的空格导致它失败。我更新了我的答案以使用量词设置您想要的构造。
  • 不在代码中使用空格。我给出了一个像“68jjdn780”这样的输入字符串,但在我上面的评论中正则表达式失败了。我想要一些正则表达式,它只会在字符串中看到给定的数字(整数),而忽略其他所有内容。我已经编辑了我的问题。感谢您的及时回复。
  • 我已更新我的答案以过滤掉字母,同时计算输入中的总位数。它是通过匹配(可选)数字之前的任何字母序列来完成的,最后添加一个额外的可选匹配以丢弃尾随字母。请注意,我使用了相当多的括号来限制正则表达式中每个部分的范围。
  • 谢谢。我一定会尽量在我的描述中更具体。
【解决方案2】:

我建议使用 https://github.com/flexguse/validation-violation-checker 测试您的 JSR303 注释 bean,这是一个小的 JUnit 插件。

如果你使用 Eclipse 作为你的 IDE,我推荐 QuickRex 插件https://marketplace.eclipse.org/content/quickrex。

使用这两个工具,您应该可以非常快速地反复试验来创建您的正则表达式,这可能是

[0-9]{1,}[a-z]{1,}[0-9]{1,}

【讨论】:

  • 谢谢。将尝试两者。顺便说一句,您的正则表达式是否适用于任何输入大小?输入的大小未知。
  • 是的,这个正则表达式应该适用于任何输入大小,必须至少有一个前导数字,后跟至少一个字符,后跟至少一个数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 2018-10-10
  • 1970-01-01
相关资源
最近更新 更多