正则表达式中的可选字符

时间:2009-05-19 17:16:24

标签: regex optional

任务非常简单,但我还没有找到一个好的解决方案:一个字符串可以包含数字,短划线和加号,或者只包含数字。

^[0-9+-]+$
除了用户输入“+ - + - +”

之类的垃圾之外,

完成了我需要的大部分工作

我对常规前瞻没有好运,因为短划线和加号可能在字符串中的任何位置。

有效字符串:

  1. 234654
  2. 24-3 + -2
  3. -234
  4. 25485 +
  5. 无效:

    1. ++ - +

5 个答案:

答案 0 :(得分:15)

这个怎么样:

([+-]?\d[+-]?)+

表示“一个或多个数字,每个数字前面或后面都有可选的加号或减号”。

这是一个Python测试脚本:

import re
TESTS = "234654 24-3+-2 -234 25485+ ++--+".split()
for test in TESTS:
    print test, ":", re.match(r'([+-]?\d[+-]?)+', test) is not None

打印出来:

234654 : True
24-3+-2 : True
-234 : True
25485+ : True
++--+ : False

答案 1 :(得分:8)

怎么样:

^[0-9+-]*[0-9][0-9+-]*$

这可确保字符串中的某个位置至少有一位数字。 (看起来它可能会有很多回溯。但另一方面,它没有+或*包含在另一个+或*中,我也不喜欢。)

答案 2 :(得分:2)

^([+-]*[0-9]+[+-]*)+$

另一种解决方案是使用断言后面的肯定,确保至少有一个数字。

^[0-9+-]+$(?<=[0-9][+-]*)

或使用积极向前的断言。

(?=[+-]*[0-9])^[0-9+-]+

答案 3 :(得分:0)

我喜欢

^(?=.*\d)[\d+-]+$ 

解决方案,我自己。它确切地说明了你需要什么,而不需要任何头部刮伤。

答案 4 :(得分:0)

我会这样做:

^[-+]*\d[\d+-]*$

快速好!