scala中的正则表达式

时间:2014-03-07 10:18:20

标签: validation scala functional-programming expression

我对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`

1 个答案:

答案 0 :(得分:0)

我不完全清楚,如果赋值是通过“通过任何可用的方式”验证字符串是否与正则表达式匹配,或者专门用于实现基本的正则表达式匹配算法?

如果是前者,图书馆可以轻松地做到这一点。

如果是后者,您需要了解NFA及其与正则表达式的关系,如何解析RE(提示:解析RE需要下推自动机)以及如何针对输入字符串“执行”生成的NFA。这不完全是基础计算机科学。它也不是研究生水平,但绝对不是简单的。