我在Scala(2.11.5)中使用regexp挣扎,我有一个跟随字符串来解析(例子):
val string = "http://sth.com/sth/56,57597,14058913,Article_title,,5.html"
我想在上面的字符串中提取第三个数值(它需要在斜杠之后为第三个,因为可能有其他组跟随),为了做到这一点,我有以下正则表达式模式:
val pattern = """\/\d+,\d+,(\d+)""".r
我一直在尝试检索第三个数字序列的组,但似乎没有什么对我有效。
val matchList = pattern.findAllMatchIn(string).foreach(println)
val matchListb = pattern.findAllIn(string).foreach(println)
我也尝试过使用匹配模式。
string match {
case pattern(a) => println(a)
case _ => "What's going on?"
}
并得到了相同的结果。要么返回整个正则表达式,要么都不返回。
是否有一种简单的方法可以在Scala中检索组表单regexp模式?
答案 0 :(得分:2)
您可以使用group
scala.util.matching.Regex.Match
方法获取结果。
val string = "http://sth.com/sth/56,57597,14058913,Article_title,,5.html"
val pattern = """\/\d+,\d+,(\d+)""".r
val result = pattern.findAllMatchIn(string) // returns iterator of Match
.toArray
.headOption // returns None if match fails
.map(_.group(1)) // select first regex group
// or simply
val result = pattern.findFirstMatchIn(string).map(_.group(1))
// result = Some(14058913)
// result will be None if the string does not match the pattern.
// if you have more than one groups, for instance:
// val pattern = """\/(\d+),\d+,(\d+)""".r
// result will be Some(56)
答案 1 :(得分:2)
模式匹配通常是最简单的方法,但它需要匹配整个字符串,因此您必须使用.*
为正则表达式模式添加前缀和后缀:
val string = "http://sth.com/sth/56,57597,14058913,Article_title,,5.html"
val pattern = """.*\/\d+,\d+,(\d+).*""".r
val pattern(x) = string
// x: String = 14058913