Java:使用正则表达式对字符串中的数字进行计数

Java:使用正则表达式对字符串中的数字进行计数,java,regex,string,Java,Regex,String,我正在研究正则表达式,想知道如何检查字符串中是否包含精确数量的数字字符,尽管事实上它们可能被分割,但其他类型的字符除外 这里我有一个方法可以检查字符串是否遵循这些参数: 1) 如果字符串以“+”开头,则该字符串必须正好有12个数字 2) 若字符串以“(”或数字开头,那个么字符串必须正好有10个数字 3) 字符串可能包含0-2个'-'字符,这些字符不能一个接一个地出现,例如:'-' 4) 字符串可能包含一对括号“(”和“)”,但它位于“-”的左侧 5) 括号之间必须有3个数字 6) 字符串中不包含

我正在研究正则表达式,想知道如何检查字符串中是否包含精确数量的数字字符,尽管事实上它们可能被分割,但其他类型的字符除外

这里我有一个方法可以检查字符串是否遵循这些参数:

1) 如果字符串以“+”开头,则该字符串必须正好有12个数字

2) 若字符串以“(”或数字开头,那个么字符串必须正好有10个数字

3) 字符串可能包含0-2个'-'字符,这些字符不能一个接一个地出现,例如:'-'

4) 字符串可能包含一对括号“(”和“)”,但它位于“-”的左侧

5) 括号之间必须有3个数字

6) 字符串中不包含非数字字符

7) 字符串以数字结尾

以下是方法本身:

public static boolean checkTelNumber(String number) {
        if (number.matches("\\d{12} | \\d{10}"))
            return number.matches("^\\+?(\\d*(\\(\\d{3}\\))?\\d*(\\-?\\d+\\-?)?\\d*)");
        else return false;
}
如果删除
if(number.matches(\\d{12}\\\d{10}”)
字符串的一部分,此方法将正确检查所有内容,但字符串中是否包含10/12数字除外。提前谢谢

我的所有输出:

方法输出|结果编号|实际结果|我用来检查的编号

true - 1 true +380501234567
true - 2 true +38050123-45-67
true - 3 true +38050123-4567
true - 4 true +3805012345-67
true - 5 true +38(050)1234567
true - 6 true +38(050)123-45-67
true - 7 true +38(050)12345-67
true - 8 true +38(050)123-4567
true - 9 true +-313450531202
true - 10 true +38051202(345)7
true - 11 true +38051202(345)-7
false - 12 false +38050)1234567
false - 13 false +38050)123-45-67
false - 14 false +38050)123-4567
false - 15 false +38050)12345-67
false - 16 false +38(0501234567
false - 17 false +38(050123-45-67
false - 18 false +38(05012345-67
false - 19 false +38(050123-4567
true - 20 false +38(050)12-3456
true - 21 false +38(050)123456
true - 22 false +38(050)12345-6
true - 23 false +38(050)1-23456
false - 24 false +38)050(1234567
false - 25 false +38(050)1-23-45-6-7
false - 26 false +38-(050)1234567
false - 27 false +38((050)1234567
false - 28 false +5(0--5)1234567
false - 29 false +-313450531202))
false - 30 false +38051202(345)-7))
true - 1 true 050123-4567
true - 2 true 050123-45-67
true - 3 true 05012345-67
true - 4 true (999)1112222
true - 5 true (999)111-22-22
true - 6 true (999)111-2222
true - 7 true (999)11122-22
true - 8 true 1-23456789-0
true - 9 true (345)0512027
false - 10 false (345)0512027))
false - 11 false 1-23456789-0))
false - 12 false 7-4-4123689-5
false - 13 false 050ххх4567
true - 14 false 050123456
false - 15 false (0)501234567
有些测试不是为了假心肠
共生验证确保了匹配的正确形式

^(?=\+\D*(?:\D\D*){12}$|(?=[(\D])\D*(?:\D\D*){10}$(?!.-)(?!.-*(?!.-*)(?=[+\D()]*-?[\D()]*-?[\D()]*$)\+-\D]*(?:\(?:\(\D{3})?[-\D]*\D$

解释

 ^                                          # BOS
 # ASSERTs - Validation
 (?=
      \+                                    # if +, 12 digits
      \D*                      
      (?: \d\D* ){12}
      $ 
   |                                        # or,
      (?= [(\d] )                           # if ( or \d, 10 digits
      \D* 
      (?: \d\D* ){10}
      $ 
 )
 (?! .* -- )                                # optional -, but not 2 in a row

 (?! .* - .* \( .* \) )                     # optional (ddd) but not after -

 (?= [+\d()]* -? [\d()]* -? [\d()]* $ )     # max 2 dashes

 # MATCH
 \+?                                        # optional +
 [-\d]* 
 (?: \( \d{3} \) )?                         # optional (ddd)

 [-\d]*                                     # dash or numbers

 \d                                         # ends with number
 $                                          # EOS

请提供正确和不正确的输入示例,以帮助澄清要求并使答案更易于验证。这实际上没有问题。问题是“什么是正则表达式,它将匹配参数1-7之后的字符串?”还是“什么是正则表达式,它匹配正好包含10(或12)的字符串?”字符串中的任意数字?”所有这些规则都使正则表达式变得很难。在字符上进行简单的循环会更容易。如果我必须用正则表达式(如上所述)来修复一个程序,我可能会退出。在意识到它描述的是电话号码的规范之前,我读了5遍。一如既往,如果它回答了您的问题或有帮助,请向上投票。它工作得很好,需要一些t输入法来处理和弄清楚什么是什么,非常感谢!