加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 括号内的组在Scala中工作吗?

发布时间:2020-12-14 06:01:51 所属栏目:百科 来源:网络整理
导读:正则表达式中的括号似乎不适用于match / case语句.例如,以下代码 val pat1 = """ab""".rval pat2 = """(a)(b)""".rval pat3 = """((a)(b))""".rval pat4 = """((a)b)""".rval pat5 = """(ab)""".r"ab" match { case pat1(x) = println("1 " + x) case pat2(x
正则表达式中的括号似乎不适用于match / case语句.例如,以下代码

val pat1 = """ab""".r
val pat2 = """(a)(b)""".r
val pat3 = """((a)(b))""".r
val pat4 = """((a)b)""".r
val pat5 = """(ab)""".r
"ab" match {
  case pat1(x) => println("1 " + x)
  case pat2(x) => println("2 " + x)
  case pat3(x) => println("3 " + x)
  case pat4(x) => println("4 " + x)
  case pat5(x) => println("5 " + x)
  case _ => println("None of the above")
}

打印“5 ab”,但我希望任何模式都匹配.我想用“(…)?”可选元素,但我不能.与此相关,我不能(?m)工作.我的模式在匹配/案例表达式之外工作正常.有人可以向我解释Scala如何处理匹配/案例表达式中的正则表达式?

我正在尝试在Scala中编写一个tokenizer

解决方法

正则表达式定义unapplySeq,而不是unapply,这意味着你将每个组都放在自己的变量中.此外,虽然小写匹配器可能在某些情况下工作(即使用参数),但您确实应该使用大写.那么,将起作用的是:

val Pat1 = """ab""".r
val Pat2 = """(a)(b)""".r
val Pat3 = """((a)(b))""".r
val Pat4 = """((a)b)""".r
val Pat5 = """(ab)""".r
def no() { println("No match") }
"ab" match { case Pat1() => println("Pat1"); case _ => no }
"ab" match { case Pat2(x,y) => println("Pat2 "+x+" "+y); case _ => no }
"ab" match { case Pat3(x,y,z) => println("Pat3 "+x+" "+y+" "+z); case _ => no }
"ab" match { case Pat4(x,y) => println("Pat4 "+x+" "+y); case _ => no }
"ab" match { case Pat5(x) => println("Pat5 "+x); case _ => no }

(你总会得到一个匹配.)

如果你想要所有比赛,请使用@ _ *

"ab" match { case Pat3(w @ _*) => println(w); case _ => no }

我不确定你的意思(?a)所以我不知道它有什么问题.不要将(?a)与(?:a)(或与(a?)或与(a)?)混淆.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读