Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Scala中的递归正则表达式_Regex_Scala_Recursion - Fatal编程技术网

Regex Scala中的递归正则表达式

Regex Scala中的递归正则表达式,regex,scala,recursion,Regex,Scala,Recursion,我有一个Scala方法,它当前接受输入并与正则表达式匹配: def valiateMap(mapDef : String) : String = { val mapRegex = "map<([int,string,date]),([int,string,date])>".r mapDef match { case mapRegex(keyGroup, valueGroup) => "Yes, we have a match!"

我有一个Scala方法,它当前接受输入并与正则表达式匹配:

def valiateMap(mapDef : String) : String = {
    val mapRegex = "map<([int,string,date]),([int,string,date])>".r
    mapDef match {
        case mapRegex(keyGroup, valueGroup)   =>    "Yes, we have a match!"
        case _                                =>    "'Fraid not."
    }
}
def valiateMap(mapDef:String):String={
val mapRegex=“map”.r
mapDef匹配{
case mapRegex(keyGroup,valueGroup)=>“是的,我们有一个匹配项!”
案例u=>“‘恐怕不是。”
}
}
如您所见,传入各种值将产生以下结果:

  • validateMap(“map”)
    ->“是的,我们有一个匹配项!”
  • validateMap(“fizzbuzz”)
    ->“我不会。”
  • validateMap(“map”)
    ->“'Fraid not.”(fizz对regex无效)
现在我需要使这个正则表达式递归,这样“
valueGroup
”(第二组)值本身就可以是一个映射,遵循与上面相同的正则表达式。该映射的值也可以有一个映射,它需要遵守相同的正则表达式。诸如此类

因此,我需要修改正则表达式(和/或代码)以处理输入,如:

  • validateMap(“map”)
    ->“是的,我们有一个匹配项!”
  • validateMap(“map”)
    ->“是的,我们有一个匹配项!”
  • validateMap(“映射”)
    ->“不能。”
更重要的是,这需要(潜在地)无限递归,并处理任意数量的内部嵌套映射

关于如何实现这一点,有什么想法吗?

试试这个:

def validateMap(mapDef : String) : String = {
  val terminal = "map<(int|string|date),(int|string|date)>".r
  val arbitrary = "map<(int|string|date),(.*)>".r
  mapDef match {
    case terminal(keyGroup, valueGroup)   =>    "Yes, we have a match!"
    case arbitrary(keyGroup, valueGroup)  =>    validateMap(valueGroup)
    case _                                =>    "'Fraid not."
  }
}
def validateMap(mapDef:String):String={
val terminal=“map”.r
val=“map”.r
mapDef匹配{
案例终端(keyGroup,valueGroup)=>“是的,我们有一个匹配项!”
大小写任意(keyGroup,valueGroup)=>validateMap(valueGroup)
案例u=>“‘恐怕不是。”
}
}

正则表达式是一种形式化语言,用于匹配输入符号字符串中的某些类型的模式。作为基本定义,正则表达式不支持的一种模式是递归嵌套模式

@Reactormonk在他们的评论中提供的链接提到了试图使用正则表达式正确解析HTML的类似问题,由于相同的递归嵌套模式匹配,这一问题将失败


<>因为常规记录是错误的工具,你可以考虑语法分析器组合器。这些将更加复杂,但更一般的情况是免提的。Scala有一个内置的API,或者您可以使用第三方库行fastparse。

阅读正则表达式匹配开放标记(XHTML自包含标记除外),然后判断这是个坏主意,然后选择其中一个或uhh,什么?!?!?正确的。不知怎么忘记了链接: