我有一个解决方案,但唯一的问题是,例如“7=7=7”匹配,这不应该是这样的。
^[+-]?\d+([/*+-]\d+)*([/*+-]*=(?:[+-]?\d+([/*+-]\d+)*)+)*$
见下面的匹配和不匹配
这些是匹配的,这是正确的
456+5
0
0+0
5=0
1589+232
55+2
5+55
545454545
-12*53+1-2/5
+1+2+3=-5*2/3
000=0
18=+17/25
0-0
0*0
0/0
1/1
5/5
6*6
55/55
1/22
+55
5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5*5*5*5/5/5/5*5*5*5=5*5*5*5*5*5*5*5*5*5*5*5*5*5/5+5/5-6/5555/6
0*0*0*0*0*0*0+0=00000000*0*0
003+3*2
除了“7=7=7”之外,所有这些都不应该匹配。
0=
5654*45=
*23
55++55
55+
7=7=7
18/-35
5*x
3.14159265358
我怎么能修复等号只能在那里一次,同时也必须,如果一个等号在那里,那么必须有一个数字之后
答案必须是正则表达式
2条答案
按热度按时间bprjcwpo1#
您可以将最后的
*
替换为?
:最多只能发生一次请注意,正则表达式也允许这样做:
这似乎不对。我不知道为什么
[/*+-]*
要放在=
之前。你可以通过使用一个否定的前瞻Assert来避免一些重复:
u2nhd7ah2#
可以匹配以下正则表达式。
这与包含多个等号的任何字符串都不匹配。
Demo
如果你要使用Python的替代正则表达式引擎(
import regex
),你可以利用它支持子例程(也称为“子表达式”)的事实:(?1)
导致其自身被匹配并保存到捕获组1(([+-]?(?:\d+[+/*-])*\d+)
)的指令所替换。这不仅减少了表达式的大小,还减少了引入错误的机会。Demo