Scala字符串模式匹配数学符号

时间:2011-01-19 11:58:13

标签: scala

我有以下代码:

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学者!

3 个答案:

答案 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"""

如果你在正则表达式周围添加三个""",则不需要再逃避任何事情了。