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