Regex Scala中的递归正则表达式
我有一个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!"
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”)
->“'Fraid not.”(fizz对regex无效)validateMap(“map”)
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,什么?!?!?正确的。不知怎么忘记了链接: