这是我第一次使用Scala正则表达式。我需要看看一个给定的字符串是否匹配正则表达式:" animal<[a-zA-Z0-9]+,[a-zA-Z0-9]+>
"。
那么,一些例子:
animal<0,sega> => valid
animal<fizz,buzz> => valid
animAl<fizz,buzz> => illegal; animAl contains upper-case (and this is case-sensitive)
animal<fizz,3d> => valid
animal<,3d> => illegal; there needs to be something [a-zA-Z0-9]+ between '<' and ','
animal<fizz,> => illegal; there needs to be something [a-zA-Z0-9]+ between ',' and '>'
animal<fizz,%> => illegal; '%' doesn't match [a-zA-Z0-9]+
etc.
我最好的尝试:
val animalRegex = "animal<[a-zA-Z0-9]+,[a-zA-Z0-9]+>".r
animalRegex.findFirstIn("animal<fizz,buzz")
不幸的是,这就是我碰壁的地方。findFirstIn
和animalRegex
的所有其他明显的方法都返回Option[String]
类型。我希望找到一些返回布尔值的东西,比如:
val animalRegex = "animal<[a-zA-Z0-9]+,[a-zA-Z0-9]+>".r
if(animalRegex.matches("animal<fizz,buzz>")) {
val leftOperand : String = getLeftOperandSomehow(...)
val rightOperand : String = getRightOperandSomehow(...)
}
所以我需要Java的matches
方法的等价物,然后需要一种方法来访问"左操作数"(即第一个[a-zA-Z0-9]+
组的值,在当前情况下是"fizz
"),然后同样适用于右/第二个操作数("buzz
")。你知道我哪里出错了吗?
为了能够从字符串中提取匹配的部分,您需要将捕获组添加到regex表达式中,如下所示(注意括号):
val animalRegex = "animal<([a-zA-Z0-9]+),([a-zA-Z0-9]+)>".r
然后,您可以使用Scala的模式匹配来检查匹配并从字符串中提取操作数:
val str = "animal<fizz,3d>"
val result = str match {
case animalRegex(op1,op2) => s"$op1, $op2"
case _ => "Did not match"
}
在本例中,result
将包含"fizz, 3d"