Сравнение шаблонов строк Scala для математических символов - PullRequest
1 голос
/ 19 января 2011

У меня есть следующий код:

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 ]

4 голосов
/ 19 января 2011

Конечно.

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().
3 голосов
/ 19 января 2011

Почти так же, как в Java. Чтобы экранировать символ в регулярном выражении, вы должны использовать префикс \. Однако обратная косая черта также является escape-символом в стандартных строках Java / Scala, поэтому, чтобы передать ее обработке регулярного выражения, необходимо снова поставить префикс it с обратной косой чертой. Вы получите что-то вроде:

scala> "+".matches("\\+")
res1 : Boolean = true

Как отмечает Джеймс Айри в комментарии ниже, Scala также поддерживает «необработанные строки», заключенные в три кавычки: """Raw string in which I don't need to escape things like \!""" Это позволяет вам избежать второго уровня экранирования, который навязывается строками Java / Scala , Обратите внимание, что вам все равно нужно экранировать любые символы, которые обрабатываются синтаксическим анализатором регулярных выражений как специальные:

scala> "+".matches("""\+""")
res1 : Boolean = true
0 голосов
/ 19 января 2011

Экранирование символов в строках работает так же, как в Java.

Если у вас есть большие строки, которые требуют большого количества экранирования, рассмотрите """.

E в Scala.г."""String without needing to escape anything \n \d"""

Если вы поместите три """ вокруг своего регулярного выражения, вам больше не нужно будет ничего избегать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...