regex 匹配简单算术表达式的正则表达式

u3r8eeie  于 2023-04-07  发布在  其他
关注(0)|答案(2)|浏览(135)

我有一个解决方案,但唯一的问题是,例如“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

我怎么能修复等号只能在那里一次,同时也必须,如果一个等号在那里,那么必须有一个数字之后
答案必须是正则表达式

bprjcwpo

bprjcwpo1#

您可以将最后的*替换为?:最多只能发生一次

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

请注意,正则表达式也允许这样做:

1+1++++++++=1

这似乎不对。我不知道为什么[/*+-]*要放在=之前。
你可以通过使用一个否定的前瞻Assert来避免一些重复:

^(?!.*=.*=)[+-]?\d+(([/*+-]|=[+-]?)\d+)*$
u2nhd7ah

u2nhd7ah2#

可以匹配以下正则表达式。

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

这与包含多个等号的任何字符串都不匹配。
Demo

^           match the beginning of the string
(?:         begin a non-capture group (A)
  [+-]?     optionally match one of the two characters in the character class
  (?:       begin a non-capture group (B)
    \d+     match one or more digits
    [+/*-]  match one of the four characters in the character class
  )         end non-capture group B
  *         execute non-capture group B zero or more times
  \d+       match one or more digits
  =         match '='
)           end non-capture group A
?           optionally match non-capture group A
[+-]?       optionally match one of the two characters in the character class
(?:         begin a non-capture group (C)
  \d+       match one or more digits
  [+/*-]    match one of the four characters in the character class
)           end non-capture group C
*           execute non-capture group C zero or more times
\d+         match one or more digits
$           match end of the string

如果你要使用Python的替代正则表达式引擎(import regex),你可以利用它支持子例程(也称为“子表达式”)的事实:

^(?:([+-]?(?:\d+[+/*-])*\d+)=)?(?1)$

(?1)导致其自身被匹配并保存到捕获组1(([+-]?(?:\d+[+/*-])*\d+))的指令所替换。这不仅减少了表达式的大小,还减少了引入错误的机会。
Demo

相关问题