我对Scala相对较新,我一直在研究一些学校项目,这一切都很好:)但是现在我仍然坚持使用正则表达式验证器。该程序必须查明正则表达式是否可以生成字符串,例如:"ad"
可以由正则表达式"(a|b)(d)"
生成。在我的实现中,这样工作:
def exp: Exp = Concat(Opcion(Simple("a"), Simple("b")),Simple("d"))`
exp.eval("ad") // returns true`
我想知道是否有更好的方法以功能的方式实现我的目标。当前的实现效率非常低,而且在尝试编写kleene闭包和正向闭包时,这变得非常复杂。
这是我到目前为止所做的:
abstract class Exp{
def eval(exp: String): Boolean = this match{
case Simple(a) => a == exp
case Opcion(a, b) => a.eval(exp) || b.eval(exp)
case Concat(a, b) => a.concat(b).eval(exp)
case COpcional(a) => Opcion(Simple(""), a).eval(exp)
}
private def concat(exp: Exp): Exp = this match{
case Simple(a) => exp match{
case Simple(b) => Simple(a + b)
case _ => Concat(Simple(a), exp)
}
case Opcion(a, b) => Opcion(a.concat(exp), b.concat(exp))
case Concat(a, b) => a.concat(b.concat(exp))
case COpcional(a) => Opcion(Simple("").concat(exp), a.concat(exp))
}
}`
case class Simple(valor: String) extends Exp`
case class Opcion(e1: Exp, e2: Exp) extends Exp`
case class Concat(e1: Exp, e2: Exp) extends Exp`
case class COpcional(e1: Exp) extends Exp`
case class CPositiva(e1: Exp) extends Exp`
case class CKleene(e1: Exp) extends Exp`
答案 0 :(得分:0)
我不完全清楚,如果赋值是通过“通过任何可用的方式”验证字符串是否与正则表达式匹配,或者专门用于实现基本的正则表达式匹配算法?
如果是前者,图书馆可以轻松地做到这一点。
如果是后者,您需要了解NFA及其与正则表达式的关系,如何解析RE(提示:解析RE需要下推自动机)以及如何针对输入字符串“执行”生成的NFA。这不完全是基础计算机科学。它也不是研究生水平,但绝对不是简单的。