我正在尝试检查字符串是否为单项式,即a:
然而,似乎唯一有效的是它是一个常量(和一个整数,小数会失败)。
我错过了什么或做错了什么?
这就是我所拥有的:
:schoolid
应该有效的示例,但不起作用: " 3x"," -x",3y ^ 4"," 6.12e ^ 2.0x"," d ^ -90"
答案 0 :(得分:1)
让我们看看你的所有正则表达式,看看可以做些什么(为了清楚起见,我已将所有\\
转义替换为\
。
"-?\d*\.?\d*e\^-?\d*\.?\d*x" - exponential
"-?\d*\.?" - constant
"-?\[a-zA-Z]" - variable
"-?\d*\.?\[a-zA-Z]" - constant w/ variable
"-?\[a-zA-Z]\^-?\d*\." - variable w/ exponent
"-?\d*\.?\[a-zA-Z]\^-?\d*\." - constant w/ variable w/ exponent
在指数表达式中,您允许\d
长度为零到无穷大。这意味着此语句匹配:e^x
表达式也可以匹配2.e^6x
,这显然是无效的,因为有一个小数,后面没有数字。
我们可以通过执行以下操作来解决此问题:
- \ d +?:电子\ ^ - \ d +(\ d +?)?(?:\。d +)?X
通过将*
换成+
,我们告诉它匹配一个或多个所选内容。这意味着必须至少有一个数字。通过对小数和以下\d
进行分组,我们告诉它是否有小数,后面必须至少再跟上一个数字。
常量值的表达式遭受相同的零长度数缺陷。此外,它不匹配小数点后的任何数字。
- \ d +?(?:\。d +)?
变量的表达式已转义[
字符,这意味着它只会匹配以下两个字符串:-[a-zA-Z]
和[a-zA-Z]
。我假设这不是故意的。要解决这个问题,我们只需删除反斜杠。
- [A-ZA-Z]
带变量的常量的表达式与上面的表达式具有相同的错误(零数字,小数点后没有数字,转义[
)
- \ d +?(?:\。d +)[α-ZA-Z]
带指数的变量的表达式也有同样的错误
- [A-ZA-Z] \ ^ - \ d +?(?:\。d +)?
最后,带有变量和指数的常量的表达式:
- \ d +?:[A-ZA-Z] \ ^ - \ d +(\ d +?)?(?:\。d +)?