正则表达式:Scala中的匹配和标记化

时间:2015-11-05 14:02:02

标签: regex scala

我试图从输入字符串中提取某些模式。这些模式为+, - , *, / , (, ), logintegerfloat numbers

以下是所需行为的示例:

//input string
var str = "log6*(12+5)/2-34.2"

//wanted result
var rightResp = Array("log","6","*","(","12","+","5",")","/","2","-","34.2")

我曾尝试这样做一段时间,但我不得不承认正则表达式不是我的专长。下一段代码显示了我被困的地方:

import scala.util.matching.Regex

var str = "log6*(12+5)/2-34.2"

val pattern = new Regex("(\\+|-|log|\\*|\\/|[0-9]*\.?[0-9]*)")

pattern.findAllIn(str).toArray

结果不是很好,因为括号“(”和“)”没有匹配,而integer(6,12,5,2)float(34.2)的数字也混乱了。谢谢你的帮助!

1 个答案:

答案 0 :(得分:3)

您可以使用

[+()*/-]|log|[0-9]*\\.?[0-9]+

请参阅regex demo

正则表达式包含在|交替运算符的帮助下加入的3个备选方案。

  • [+()*/-] - 匹配单个文字字符:+()*/- (请注意,连字符不会转义,因为它位于字符类的末尾)
  • log - 字母序列log
  • [0-9]*\\.?[0-9]+ - 一个浮点数,它接受.055.55之类的值,因为它匹配...
    • [0-9]* - 0位或以上
    • \\.? - 和可选的(1或0)文字句号
    • [0-9]+ - 1或更多数字炎。

这是Scala code sample

import scala.util.matching.Regex
object Main extends App {
   var str = "log6*(12+5)/2-34.2"
   val pattern = new Regex("[+()*/-]|log|[0-9]*\\.?[0-9]+")
   val res = pattern.findAllIn(str).toArray
    println(res.deep.mkString(", "))
}

结果:log, 6, *, (, 12, +, 5, ), /, 2, -, 34.2