解析nginx重写规则以从中提取和到

时间:2018-04-12 20:44:54

标签: scala functional-programming

如果我有一个nginx-esque配置重写语句列表:

val rewritesList : List[String] = List(
"rewrite (?i)^/first$ http://www.firstredirect.com redirect;",
"rewrite (?i)^/second$ http://www.seconredirect.com redirect;"
)

我想从该列表中提取fromto。只要我提取信息,我就不会担心最终的结构,但为了示范:

val rewritesMap : Map[String, String] = Map(
"first" -> "http://www.firstredirect.com",
"second" -> "http://www.seconredirect.com"
)

1 个答案:

答案 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。如果数据与正则表达式不匹配,我不知道你想做什么:你可以引发异常,但你也可以简单地跳过那些没有被正确解析的情况。