我有以下正则表达式:
\+?[0-9\.,()\-\s]+$
允许:
此外,我需要确保数字和加号(如果存在)的长度在9到15之间(因此,我不算除+号之外的任何特殊字符)。
最后一个条件就是我遇到的问题。
有效输入:
无效输入:
尽可能使用正则表达式很重要,因为它在javax.validation.constraints.Pattern注释中的使用方式为:
@Pattern(regexp = REGEX)
private String number;
我在这里寻找REGEX的地方。
如果无法提供正则表达式,则意味着我需要重写实体验证实现。那么是否可以在正则表达式中添加这样的条件,还是我需要一个函数来验证这种模式?
答案 0 :(得分:1)
您可以使用
^(?=(?:[^0-9+]*[0-9+]){9,15}[^0-9+]*$)\+?[0-9.,()\s-]+$
请参见regex demo
详细信息
^
-字符串的开头 (?=(?:[^0-9+]*[0-9+]){9,15}[^0-9+]*$)
-正向超前,其模式必须与正则表达式匹配才能找到匹配项:
(?:[^0-9+]*[0-9+]){9,15}
-重复9到15次[^0-9+]*
-除数字和+
符号外的任何0+个字符[0-9+]
-一个数字或+
[^0-9+]*
-除数字和+
之外的0+个字符$
-字符串结尾 \+?
-可选的+
符号
[0-9.,()\s-]+
-1个或多个数字,.
,,
,(
,)
,空格和-
字符$
-字符串的结尾。在Java中,当与matches()
一起使用时,^
和$
锚点可以省略:
s.matches("(?=(?:[^0-9+]*[0-9+]){9,15}[^0-9+]*$)\\+?[0-9.,()\\s-]+")
答案 1 :(得分:1)
不使用正则表达式,您可以简单地循环并计算数字和+
:
int count = 0;
for (int i = 0; i < str.length(); i++) {
if (Character.isDigit(str.charAt(i)) || str.charAt(i) == '+') {
count++;
}
}
答案 2 :(得分:0)
由于您使用的是Java,因此我不会仅依赖于正则表达式:
String input = "+123,456.789";
int count = input.replaceAll("[^0-9+]", "").length();
if (input.matches("^\\+?[0-9.,()\\-\\s]+$") && count >= 9 && count <= 15) {
System.out.println("PASS");
}
else {
System.out.println("FAIL");
}
这种方法使我们可以直接使用您原来的正则表达式。我们使用Java字符串调用来处理数字(可能还有加号)的长度要求。