正则表达式:限制字母数字字符串中出现的数字字符

时间:2016-07-11 09:20:53

标签: regex

我正在尝试编写一个符合以下条件的正则表达式(用于java)(这是一种特定的电话格式)

  1. 可以(但不是必须)以+
  2. 开头
  3. 可以包含#或 -
    • a)列表项
    • b)不在字符串的START或END
    • c)这些
    • 不能连续出现两次
  4. 除了+, - ,#它只能包含数字字符,数字字符(任意数字)的数量必须在8到20之间。
  5. 我知道如何做1),2a),2b)。还没试过2c。但我有严重的问题3)。 我已经以某种方式限制[0-9]的外观,但它检查相同数字的外观,我想限制任何数字的数量。

    该尝试基于: Limit number of alpha characters in regular expression

    欢迎任何想法:)

1 个答案:

答案 0 :(得分:0)

使用前瞻,这应该为你做到:

^(?=[^\d\n]*(?:\d[^\d\n]*?){8,20}$)(?!.*[-#][-#])\+?[\d][\d#-]+[\d]$

它以正向前视开始,检查8到20个重复的数字,然后是任意数量的非数字重复。这可以选择在任意数量的非数字之前。这是对数字位数的验证。

然后有一个负面的预测断言没有任何重复的连字符或散列符号(捕获一个后跟一个后引用=连续两个)。

最后它允许一个可选的+,之后它只是对任意数量的重复数字,连字符和井号的测试。

Check the examples here at regex101

修改

修改正则表达式以处理案例2b,以及2c,其中一个直接跟随另一个(-##-)。