2015-11-05 65 views
2

我试图从输入字符串中提取某些模式。这些模式是+, - , *,/, (,),log,integerfloat numbers正则表达式:在Scala中匹配和标记化

这里的例子为需要的行为:

//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)都搞砸了。谢谢你的帮助!

+0

试试['[+()*/- ] |登录| [0-9] * \\。 ?[0-9] +'](https://regex101.com/r/bT7uA7/1)。 –

+0

@stribizhev非常感谢!如果您将其作为答案发布,我会很乐意接受并接受您的答案。 – grubjesic

回答

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以上digitis。

这里是一个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

+0

如果你需要添加更多的单字符支持,将其添加到字符类(只有'['和']'必须在那里转义)。如果您需要支持更多序列,请使用'|'替代运算符添加它们。 –

+0

如果'str'改为'“log6 *( - 12 + 5)/2-34.2”',这个工作是否会像OP期望的那样? –

+0

@grubjesic:这是你的问题范围吗? –