如果我有一个nginx-esque配置重写语句列表:
val rewritesList : List[String] = List(
"rewrite (?i)^/first$ http://www.firstredirect.com redirect;",
"rewrite (?i)^/second$ http://www.seconredirect.com redirect;"
)
我想从该列表中提取from
和to
。只要我提取信息,我就不会担心最终的结构,但为了示范:
val rewritesMap : Map[String, String] = Map(
"first" -> "http://www.firstredirect.com",
"second" -> "http://www.seconredirect.com"
)
答案 0 :(得分:1)
您可以将正则表达式与Scala的模式匹配结合使用:
val rewritesList : List[String] = List(
"rewrite (?i)^/first$ http://www.firstredirect.com redirect;",
"rewrite (?i)^/second$ http://www.seconredirect.com redirect;"
)
val Regex = """^rewrite \(\?i\)\^/(\w+)\$ ([^ ]+) redirect;$""".r
val rewritesMap = (for {
Regex(from, to) <- rewritesList
} yield (from -> to)).toMap
println(rewritesMap)
您还可以使用更明确的findFirstMatchIn
来提取单个匹配项:
val rewritesMap = (for {
str <- rewritesList
} yield {
val m = Regex.findFirstMatchIn(str).get
(m.group(1), m.group(2))
}).toMap
两个版本都打印(最多缩进):
Map(
first -> http://www.firstredirect.com,
second -> http://www.seconredirect.com
)
请注意,如果输入数据不是正则表达式定义的格式,则后一种变体将抛出NoSuchElementException
。如果数据与正则表达式不匹配,我不知道你想做什么:你可以引发异常,但你也可以简单地跳过那些没有被正确解析的情况。