Regex 正则表达式中的可选字符

Regex 正则表达式中的可选字符,regex,optional,Regex,Optional,任务非常简单,但我还没有找到一个好的解决方案:字符串可以包含数字、破折号和加号,也可以只包含数字 ^[0-9+-]+$ 除了用户输入“+-+--+”之类的垃圾外,我所需要的大部分都是 我没有运气进行常规的前瞻,因为破折号和加号可能在字符串中的任何位置 有效字符串: 234654 24-3+-2 -234 25485+ 无效: ++--+ 那么: ^[0-9+-]*[0-9][0-9+-]*$ 这确保字符串中至少有一个数字。(看起来它可能有很多回溯,但另一方面,它没有一个+或*包装在另一个+或

任务非常简单,但我还没有找到一个好的解决方案:字符串可以包含数字、破折号和加号,也可以只包含数字

^[0-9+-]+$
除了用户输入“+-+--+”之类的垃圾外,我所需要的大部分都是

我没有运气进行常规的前瞻,因为破折号和加号可能在字符串中的任何位置

有效字符串:

  • 234654
  • 24-3+-2
  • -234
  • 25485+
  • 无效:

  • ++--+
  • 那么:

    ^[0-9+-]*[0-9][0-9+-]*$
    
    这确保字符串中至少有一个数字。(看起来它可能有很多回溯,但另一方面,它没有一个+或*包装在另一个+或*中,我也不喜欢。)

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

    ^[0-9+-]+$(?<=[0-9][+-]*)
    
    这个怎么样:

    ([+-]?\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
    
    我喜欢这个

    ^(?=.*\d)[\d+-]+$ 
    
    解决方案,我自己。它准确地说出了你所需要的,而不需要任何挠头

    我会这样做:

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

    快就是好

    我也这么想,但2+++5合法吗?这是你的正则表达式。如果“24-3+-2”是合法的(而且似乎是合法的),那么我猜2+++5也是合法的。好吧,这个问题没有提到任何有效的数学表达式。如果是他想要的数学表达式,表达式树会比正则表达式好得多。但是我注意到*和/是不允许的,所以我认为这不应该是数学。我发现你的有效字符串很奇怪。介意解释一下背景吗?我的第一个猜测是算术表达式将3+-+4解释为3+(+4))。但是后面的加号和减号不适合这张图片。几乎不错!唯一的问题是,当您将锚添加到此表达式时,如下所示:
    ^([+-]?\d+[+-]?)+$
    这将在显示类似这样的不匹配字符串时遇到:
    01234567890123456789X
    问题在于这本质上是:
    (\d+)
    ,这是回溯正则表达式引擎灾难的一个原因。要解决此问题,只需从
    \d+
    中删除
    +
    ,如下所示:
    ^([+-]?\d[+-]?)+$
    -这非常有效。修好它,你就会得到我的+1。欢迎你。我已经了解到,测试不匹配的情况是最重要的——这是大多数问题潜伏的地方+1
    ^([+-]*[0-9]+[+-]*)+$
    将在不匹配的情况下变得病态(请参阅我对Richies解决方案的评论)。
    ^[0-9+-]+$(?
    
    ^(?=.*\d)[\d+-]+$ 
    
    ^[-+]*\d[\d+-]*$