Scala相当于'匹配'正则表达式方法?

时间:2016-09-29 19:54:02

标签: regex scala

在这里与我的第一个(曾经)Scala正则表达式一起苦苦挣扎。我需要查看给定的String是否与正则表达式匹配:“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”),然后ditto为右/第二个操作数(“buzz”)。我有什么想法会出错吗?

1 个答案:

答案 0 :(得分:5)

为了能够从字符串中提取匹配的部分,您需要将捕获组添加到正则表达式中,如下所示(注意括号):

sqoop import --connect jdbc:oracle:thin:@(DESCRIPTION=(CONNECT_TIMEOUT=10)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=<ip address>)(PORT=<port>)))(CONNECT_DATA=(SERVICE_NAME=<service-name))) --username <username>

然后,您可以使用Scala的模式匹配来检查匹配并从字符串中提取操作数:

val animalRegex = "animal<([a-zA-Z0-9]+),([a-zA-Z0-9]+)>".r

在此示例中,val str = "animal<fizz,3d>" val result = str match { case animalRegex(op1,op2) => s"$op1, $op2" case _ => "Did not match" } 将包含result