我有以下代码:
val z: String = tree.symbol.toString
z match {
case "method +" | "method -" | "method *" | "method ==" =>
println("no special op")
false
case "method /" | "method %" =>
println("we have the special div operation")
true
case _ =>
false
}
是否可以为Scala中的基元操作创建匹配:
"method *".matches("(method) (+-*==)")
我知道(+ - *)符号用作量词。有没有办法匹配他们呢? 感谢一位狂热的Scala学者!
答案 0 :(得分:4)
不确定
val z: String = tree.symbol.toString
val noSpecialOp = "method (?:[-+*]|==)".r
val divOp = "method [/%]".r
z match {
case noSpecialOp() =>
println("no special op")
false
case divOp() =>
println("we have the special div operation")
true
case _ =>
false
}
需要考虑的事项:
[abc]
代替(?:a|b|c)
来匹配单个字符。-
必须是使用[]
时的第一个字符,否则它将被解释为范围。同样,^
不能是[]
中的第一个字符,否则会被解释为否定。(?:...)
代替(...)
,因为我不想提取内容。如果我 希望提取内容 - 例如,我知道运营商是什么,那么我就会使用(...)
。但是,我还必须将匹配更改为接收提取的内容,否则会使匹配失败。()
,例如divOp()
。如果您忘记了它们,则会进行简单的分配(Scala会抱怨无法访问的代码)。"method ([%/])".r
将匹配divOp(op)
,但不匹配divOp()
。答案 1 :(得分:3)
与Java大致相同。要转义正则表达式中的字符,请在字符前加\
。但是,反斜杠也是标准Java / Scala字符串中的转义字符,因此要将其传递给正则表达式处理,必须使用反斜杠再次为 it 添加前缀。你得到的结果如下:
scala> "+".matches("\\+")
res1 : Boolean = true
正如James Iry在下面的评论中指出的那样,Scala也支持“原始字符串”,用三个引号括起来:"""Raw string in which I don't need to escape things like \!"""
这样可以避免Java /强加的第二级转义斯卡拉字符串。请注意,您仍然需要转义正则表达式解析器处理为特殊的任何字符:
scala> "+".matches("""\+""")
res1 : Boolean = true
答案 2 :(得分:0)
在Strings中转义字符就像在Java中一样。
如果你有更大的字符串,需要大量的转义,请考虑Scala的"""
。
电子。 G。 """String without needing to escape anything \n \d"""
如果你在正则表达式周围添加三个"""
,则不需要再逃避任何事情了。