首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用正则表达式解析具有复系数的多项式

用正则表达式解析具有复系数的多项式
EN

Stack Overflow用户
提问于 2015-09-29 12:45:52
回答 1查看 1K关注 0票数 1

作为计算方阵的Jordan范式的个人项目的一部分,我需要解析具有复系数的多项式,以简化大量的代码。

(帖子底部的相关代码)

我想解析的多项式有以下形式:

  1. 系数可以是实的,也可以是虚的,也可以是复杂的。
  2. 如果系数是复杂的,它将用括号包装。如果这些括号是前导系数,则前面不会有+-
  3. 如果系数是实的、虚的或复的,其实和\或虚分量为1级,则1不会出现,而只出现符号。
  4. 括号前只有+
  5. 变量x可能有幂(>2),可能有1的幂,然后它显示为x,或者根本不出现。
  6. 不再有关于多项式文本表示的规则,即幂不一定是按升序\降序排列的。

适当格式化多项式的一些例子:

  • 1
  • -1
  • -2.1x
  • 3i
  • x^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

这是正在提出的例外情况:

代码语言:javascript
运行
复制
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中需要进行什么调整才能使整个节目正常工作。另外,正则表达式不像上面提到的表示约束那样有序,因为在尝试将系数解析为实之前,我想看看系数是否很复杂;还遇到了实数(即小数点)被解析为整数的问题,所以正则表达式首先处理实数。

裁判官:

代码语言:javascript
运行
复制
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

相关代码在档案中:

  1. PolyParser.java
  2. Polynomial.java
  3. Complex.java

测试单元在文件PolyParserTest.java中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-29 14:18:16

Regexes基本上不能解析表达式,因为它们无法跟踪嵌套(例如括号)。这是大多数人都不知道的一课,他们很难发现这一点。

然而,表达式很容易解析,使用自顶向下的解析.请参阅我关于如何执行此操作的答案:https://stackoverflow.com/a/2336769/120163 --这个答案介绍了如何只进行解析,并链接到另一个讨论如何构建一个AST来表示表达式的答案。

第一步:编写表示表达式允许的语法。你的问题中有一个特别的描述,但是语法会迫使你写什么是合法的,什么是不合法的。使用该语法,您可以很容易地编写上面建议的递归下降解析器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32844417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档