来自url的正则表达式域和路径

时间:2016-08-31 08:32:04

标签: regex scala url

我有一个网址:

https://widgets.shopifyapps.com/channel_admin/embeds/new?id=1243326021&product_handle=s-n-ph-m-4&product_name=S%25E1%25BA%25A3n%2520ph%25E1%25BA%25A9m%25204&first_variant_id=3897975749

我想使用正则表达式来获取域和路径。 我试过遵循正则表达式语法:(?:https?://)?(?:www\.)?([A-Za-z0-9._%+-]+)/?.*" 其中有以下输出:widgets.shopifyapps.com 但是,我想输出:widgets.shopifyapps.com/channel_admin/embeds/new 我正在使用Scala。请帮我解压缩上面的域名。谢谢!

1 个答案:

答案 0 :(得分:0)

有几种方法可以实现这一目标。一个是使用Java URL类(demo)的非正则表达式:

import java.net.URL;
object Main extends App {
    val a_url = new URL("https://widgets.shopifyapps.com/channel_admin/embeds/new?id=1243326021&product_handle=s-n-ph-m-4&product_name=S%25E1%25BA%25A3n%2520ph%25E1%25BA%25A9m%25204&first_variant_id=3897975749");
    print(s"${a_url.getHost()}${a_url.getPath()}");
}

或者,您可以使用匹配正则表达式.*?://([^?]+).*并获取第1组内容:

val a_url = "https://widgets.shopifyapps.com/channel_admin/embeds/new?id=1243326021&product_handle=s-n-ph-m-4&product_name=S%25E1%25BA%25A3n%2520ph%25E1%25BA%25A9m%25204&first_variant_id=3897975749";
val pattern = """.*?://([^?]+).*""".r
a_url match {
  case pattern(myval) => println(myval)
  case _ =>
}

请参阅此Scala demo

或具有正向前瞻性的变体:

val a_url = "https://widgets.shopifyapps.com/channel_admin/embeds/new?id=1243326021&product_handle=s-n-ph-m-4&product_name=S%25E1%25BA%25A3n%2520ph%25E1%25BA%25A9m%25204&first_variant_id=3897975749";
val myval = """(?<=://)[^?]+""".r.findFirstIn(a_url).getOrElse("")
println(myval)

请参阅yet another demo