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

Java 正则表达式中某些字符的长度,java,regex,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.777(33个字符和仅2

我有以下正则表达式:

\+?[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.777(33个字符和仅20个计数字符(数字和加号)太多)
如果可能的话,使用regex很重要,因为它在javax.validation.constraints.Pattern注释中的用法如下:

@Pattern(regexp = REGEX) 
private String number;
我要找的就是我的正则表达式

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

您可以使用

^(?=(?:[^0-9+]*[0-9+]){9,15}[^0-9+]*$)\+?[0-9.,()\s-]+$

详细信息

  • ^
    -字符串的开头
  • (?=(?:[^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-]+")

不使用正则表达式,您可以简单地循环和计数数字和
+
s:

int count = 0;
for (int i = 0; i < str.length(); i++) {
    if (Character.isDigit(str.charAt(i)) || str.charAt(i) == '+') {
        count++;
    }
}
int count=0;
对于(int i=0;i
既然您使用的是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");
}
String input=“+123456.789”;
int count=input.replaceAll(“[^0-9+]”,“”)。length();

if(input.matches(“^\\+?[0-9.,()\\-\\s]+$”)&&count>=9&&count您能否提供与正则表达式匹配的可能输入?什么符号与数字一起计数以达到9到15之间的计数?@Rab正则表达式可以是特定于语言的,因此我不确定删除Java标记是否是一个好的选择。@TimBiegeleisen在beginning@WiktorStribiżew最终,我决定采用不同的方法,实现新的注释,而不是使用正则表达式,但您的答案正是我在这里寻找的答案。感谢您的详细回答。答案不错,但在Java代码库的上下文中,对于不擅长使用正则表达式的人来说,这么长的模式可能很难维护。