正则表达式中某些字符的长度

时间:2018-10-26 07:53:30

标签: java regex

我有以下正则表达式:

\+?[0-9\.,()\-\s]+$

允许:

  • 可选+开头
  • 然后输入数字,点,逗号,圆括号,破折号和空白。

此外,我需要确保数字和加号(如果存在)的长度在9到15之间(因此,我不算除+号之外的任何特殊字符)。

最后一个条件就是我遇到的问题。

有效输入:

  • +358(9)1234567
  • +3 5 8.9,1-2(3)4..5,6.7(25个字符,但只有12个字符可以计数(数字和加号))

无效输入:

  • +3 5 8.9,1-2(3)4..5,6.777777777(33个字符,只有20个字符(数字和加号)计数太多)

尽可能使用正则表达式很重要,因为它在javax.validation.constraints.Pattern注释中的使用方式为:

@Pattern(regexp = REGEX) 
private String number;

我在这里寻找REGEX的地方。

如果无法提供正则表达式,则意味着我需要重写实体验证实现。那么是否可以在正则表达式中添加这样的条件,还是我需要一个函数来验证这种模式?

3 个答案:

答案 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字符串调用来处理数字(可能还有加号)的长度要求。