2013-01-11 47 views
2

我已经做了一些搜索,但无法找到正确的正则表达式。RegEx计数数字,并允许特殊字符

我想要一个只包含数字,空格和加号的文本的正则表达式。 like:[0-9 +]

但是只有该文本中数字的最小/最大限制。

我的建议,结束了这样的事情:

^[0-9 \+](?=(.*[0-9]){5,8})$ 

应该确定:

  • “123 456 7”
  • “12345”
  • “+ 123 456 78”

不应该没问题:

  • “123456789”
  • “+ 124 578A”
  • “+123456789”

任何人有可能做的伎俩的解决方案?

编辑:

我可以看到我是短于我的解释是我的目标了。

我的正则表达式的条件应该是:

  • 必须包括数字5-8之间
  • 允许空格和加号
+1

你为什么不分两步做?首先检查它是否只包含所需的字符,然后对数字进行计数。 –

+0

我使用的服务只有一个字段的正则表达式条件。 :( – mannge

回答

1

我从自己的正则表达式的猜测,5和8之间允许在一行中没有空格的数字。如果这是真的,那么下面的正则表达式可能会做到这一点(用Python编写的例子)。它允许单个数字组的长度在5到8位之间。如果有多个组,则允许每个组具有正好3个数字,除了最后一个组可以是1到3个数字之间。左侧的一个加号是可选的。

你解析电话号码吗?:)

In [176]: regex = re.compile(r""" 
       ^    # start of string 
       (?: \+\s)?  # optional plus sign followed by whitespace 
       (?: 
        (?: \d{3}\s)+ # one or more groups of three digits followed by whitespace 
        \d{1,3}  # one group of between one and three digits 
        |    # ALTERNATIVE 
        \d{5,8}  # one group of between five and eight digits 
       ) 
       $     # end of string 
       """, flags=re.X) 

# --- MATCHES --- 
In [177]: regex.findall('123 456 7') 
Out[177]: ['123 456 7'] 

In [178]: regex.findall('12345') 
Out[178]: ['12345'] 

In [179]: regex.findall('+ 123 456 78') 
Out[179]: ['+ 123 456 78'] 

In [200]: regex.findall('12345678') 
Out[200]: ['12345678'] 

# --- NON-MATCHES --- 
In [180]: regex.findall('123456789') 
Out[180]: [] 

In [181]: regex.findall('+ 124 578a') 
Out[181]: [] 

In [182]: regex.findall('+123456789') 
Out[182]: [] 

In [198]: regex.findall('123') 
Out[198]: [] 

In [24]: regex.findall('1234 556') 
Out[24]: [] 
+0

您好,对不起,迟到的回答。 是的,我试图解析的电话号码。:) 我可以看到我是短于我的解释是我的目标了。小组条件根本不需要。 我有一堆电话号码。我的条件应该是: - 必须包括5-8位之间 - 可以包含空格和加号 – mannge

0

你是非常接近的 - 你需要超前锚定输入的开始,并添加第二前瞻为上限的数字的数量:

^(?=(.*\d){5,8})(?!(.*\d){9,})[\d +]+$ 

此外,仅供参考,你不需要逃避字符类中的加号,然后[0-9]\d

+0

不,既然你让'*'在你的前瞻,也将匹配更长的号码[Regexr(HTTP:// regexr.com?33ccr) – stema

+0

这与OP给出的任何示例都不匹配。 – pemistahl

+0

@stema终于想出了如何解决我的正则表达式。我在regexpal上测试了它,并且它通过了所有的例子给出了OP – Bohemian

0

你可以做这样的事情:

^(?:[ +]*[0-9]){5}(?:(?:[ +]*[0-9])?){3}$ 

查看它here on Regexr

第一组(?:[ +]*[0-9]){5}是5个最低位,具有空间的任何量和加上之前,第二部分(?:(?:[ +]*[0-9])?){3}可选位数相匹配,具有空间的任何量和加上之前。

+0

我想OP想分析电话号码。因此,任意数量的加号可能不正确。 – pemistahl

相关问题