单项式的正则表达式

时间:2016-01-08 21:44:04

标签: java regex

我正在尝试检查字符串是否为单项式,即a:

  • 常数(可能是正十进制或负十进制)
  • 变量(任何字母)
  • 指数值w /或w / out常数(ce ^ x)
  • 变量w /指数(x ^ n)
  • 常数w /变量(cn)
  • 或常数w /变量和指数

然而,似乎唯一有效的是它是一个常量(和一个整数,小数会失败)。

我错过了什么或做错了什么?

这就是我所拥有的:

:schoolid

应该有效的示例,但不起作用: " 3x"," -x",3y ^ 4"," 6.12e ^ 2.0x"," d ^ -90"

1 个答案:

答案 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 +)?