作为计算方阵的Jordan范式的个人项目的一部分,我需要解析具有复系数的多项式,以简化大量的代码。
(帖子底部的相关代码)
我想解析的多项式有以下形式:
+或-。1不会出现,而只出现符号。+。x可能有幂(>2),可能有1的幂,然后它显示为x,或者根本不出现。适当格式化多项式的一些例子:
1-1-2.1x3ix^2-1-x^3+2x+1(5-5i)x^2-x-1(-1+i)x-5-ix^3-x^2+1一些格式错误的..and:
1x (导致不必要的1)+(+1-2i)x (括号有前导+,实组件有前导+)(5.1i)x^2 (不需要括号,因为系数是虚的)-(i-1) (复数系数有前导-)在在线阅读(所以,Java教程,Java )之后,我很快得出了这样的结论: regex将是最简单的解析方法,考虑到上面提到的所有限制。在正式方面,这个任务的正则表达式是可能的,因为我画了一个NFA,它只接受这样的有效表达式。
我正在做这个TDD (通过JUnit 4),这个测试失败了:
assertEquals("Polynomial parsed incorrectly.", poly07, PolyParser.parse(exp07));
poly07看起来是这样的:(5-5i)x^2-x-1。
这是正在提出的例外情况:
java.lang.NumberFormatException: For input string: "5-5"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at PolyParser.parse(PolyParser.java:55)
at PolyParserTest.testParse(PolyParserTest.java:59)我已经尝试过调试,并看到regex捕获了5-5i (然后剥离了i)。然后尝试使用参数字符串Double.parseDouble调用5-5,这将导致异常。
在阅读了这么多之后,我不知道在regex中需要进行什么调整才能使整个节目正常工作。另外,正则表达式不像上面提到的表示约束那样有序,因为在尝试将系数解析为实之前,我想看看系数是否很复杂;还遇到了实数(即小数点)被解析为整数的问题,所以正则表达式首先处理实数。
裁判官:
public static final String POLYNOMIAL_REGEX =
"([+-])?" + // leading plus or minus
"(\\()?" + // parenthesis to denote the beginning of a complex number
"([+-])?(((\\d+.\\d+)|\\d+)i)?" + // component of coefficient, imaginary
"(((-)?\\d+.\\d+)|\\d+)?" + // component of coefficient, real
"(\\))?" + // parenthesis to denote the end of a complex number
"(x)?" + // variable
"(?:\\^(\\d+))?"; // power of the variable我不会在这里发布所有相关的代码,因为它会把东西弄得乱七八糟。所有代码都在GitHub上,只需确保切换到分支PolyParser。
相关代码在档案中:
PolyParser.javaPolynomial.javaComplex.java测试单元在文件PolyParserTest.java中。
发布于 2015-09-29 14:18:16
Regexes基本上不能解析表达式,因为它们无法跟踪嵌套(例如括号)。这是大多数人都不知道的一课,他们很难发现这一点。
然而,表达式很容易解析,使用自顶向下的解析.请参阅我关于如何执行此操作的答案:https://stackoverflow.com/a/2336769/120163 --这个答案介绍了如何只进行解析,并链接到另一个讨论如何构建一个AST来表示表达式的答案。
第一步:编写表示表达式允许的语法。你的问题中有一个特别的描述,但是语法会迫使你写什么是合法的,什么是不合法的。使用该语法,您可以很容易地编写上面建议的递归下降解析器。
https://stackoverflow.com/questions/32844417
复制相似问题