我正在试图弄清楚如何制作一个正则表达式来验证一个简单的等式项,包括符号和幂,包括小数,如下所示:
2,2.5,-2.5,-2.5 ^ 3,-2.5 ^ 3.7,+ 2,+ 2.5,......
但不是:
2
-
2.5 ^
我最好的尝试是:
([-]|[+])?([0-9]+\.[0-9]+?)(\^[0-9]+\.[0-9]+?)?
但它会测试为有效输入,如:
2.5.6
5 ^
6 ^^
我该怎么做?
答案 0 :(得分:1)
另一种方式是这样的
^[+-](?:\d+(?:\.\d*)?|\.\d+)(?:\^(?:\d+(?:\.\d*)?|\.\d+))?$
格式化:
^
[+-]
(?:
\d+
(?: \. \d* )?
| \. \d+
)
(?:
\^
(?:
\d+
(?: \. \d* )?
| \. \d+
)
)?
$
答案 1 :(得分:1)
您用于匹配的正则表达式实际匹配所有字符串,因为它们包含有效模式。如果您希望仅匹配整个字符串,则必须将正则表达式锚定到两侧,使用^
将其锚定到行(或文本)的开头,并$
将其锚定到结尾。顺便说一句,如果您使用类似[0.9]+?
的内容,则会将一个或多个运算符与零或一个链接,使其有效地成为*
} operator。
我希望小数部分是可选的,你必须创建组,如:
^[+-]?[0-9]+(\.[0-9]*)?(\^[+-]?([0-9]+)(\.[0-9]*)?)?$
对于数字来考虑子模式(因为你必须逐字重复)通常是一件好事,例如:
[+-]?[0-9]+(\.[0-9]*)?
请参阅demo
我在demo中使用gm
修饰符来允许多个匹配,并允许您在同一个字符串中查看它们。由于您只想匹配一个字符串并且如果不匹配则拒绝它,您不需要任何这些修饰符。
尝试修改它以查看更改。
答案 2 :(得分:0)
你的正则表达式有两个问题:
.
,即使后面没有数字,以下是解决这两个问题的方法:
^([-]|[+])?([0-9]+(\.[0-9]+)?)(\^[0-9]+(\.[0-9]+)?)?$
添加^
和$
可确保考虑整个字符串。使(\.[0-9]+)?
成为可选项可确保可以省略点.
。