正则表达式重定向URL排除令牌

时间:2018-04-26 13:57:37

标签: java regex url redirect token

我正在尝试为我的客户端创建重定向网址。我们有一个您使用java正则表达式匹配器指定"fromUrl" -> "toUrl"的服务。但是我无法让它在转换时包含令牌。例如:

/fromurl/login?token=7c8Q8grW5f2Kz7RP1%2FWsqpVB%2FEluVOGfXQdW4I0v82siR2Ism1D8VCvEmKJr%2BKhHhicwPey0uIiTxN049Be8TNsypf

应该是:

/tourl/login?token=7c8Q8grW5f2Kz7RP1%2FWsqpVB%2FEluVOGfXQdW4I0v82siR2Ism1D8VCvEmKJr%2BKhHhicwPey0uIiTxN049Be8TNsypf

但它排除了令牌,所以我得到的结果是:

/fromurl/login/

/tourl/login/

我尝试了各种正则表达式模式,例如:" ?.*[%5E//?]+)/([^/?]+)/(?.*)?$以及(/*)等等,但似乎没有人工作。

我对正则表达式并不熟悉。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:0)

如果我理解你,你需要这样的东西吗?

String from = "/my/old/url/login?token=7c8Q8grW5f2Kz7RP1%2FWsqpVB%2FEluVOGfXQdW4I0v82siR2Ism1D8VCvEmKJr%2BKhHhicwPey0uIiTxN049Be8TNsypf";
String to = from.replaceAll("\\/(.*)\\/", "/my/new/url/");
System.out.println(to); // /my/new/url/login?token=7c8Q8grW5f2Kz7RP1%2FWsqpVB%2FEluVOGfXQdW4I0v82siR2Ism1D8VCvEmKJr%2BKhHhicwPey0uIiTxN049Be8TNsypf";

这将替换第一个和最后一个正斜杠之间的所有内容。

答案 1 :(得分:0)

这可以使用简单的字符串替换轻松完成,但如果您坚持使用正则表达式:

Pattern p = Pattern.compile("fromurl");
    String originalUrlAsString = "/fromurl/login?token=7c8Q8grW5f2Kz7RP1%2FWsqpVB%2FEluVOGfXQdW4I0v82siR2Ism1D8VCvEmKJr%2BKhHhicwPey0uIiTxN049Be8TNsypf ";

String newRedirectedUrlAsString = p.matcher(originalUrlAsString).replaceAll("tourl");

    System.out.println(newRedirectedUrlAsString);

答案 2 :(得分:0)

您能更准确地详细说明原始表达式是什么样的吗?这是必要的,因为正则表达式基于它。

假设第一次出现 fromurl 应该只使用以下代码替换:

String from = "/fromurl/login?token=7c8Q8grW5f2Kz7RP1%2FWsqpVB%2FEluVOGfXQdW4I0v82siR2Ism1D8VCvEmKJr%2BKhHhicwPey0uIiTxN049Be8TNsypf";
String to = from.replaceFirst("fromurl", "tourl");

但是如果有必要使用更复杂的规则来确定要替换的子字符串,可以使用:

 String from = "/fromurl/login?token=7c8Q8grW5f2Kz7RP1%2FWsqpVB%2FEluVOGfXQdW4I0v82siR2Ism1D8VCvEmKJr%2BKhHhicwPey0uIiTxN049Be8TNsypf";
 String to = "";
 String regularExpresion = "(<<pre>>)(fromurl)(<<pos>>)";
 Pattern pattern = Pattern.compile(regularExpresion);
 Matcher matcher = pattern.matcher(from);
 if (matcher.matches()) {
   to = from.replaceAll(regularExpresion, "$1tourl$3");
 }

注意 pos 目标是参考的,因为我不知道网址的真实表现

注意2 :1美元和3美元是指第一组和第三组

答案 3 :(得分:0)

虽然现有的答案应该可以解决问题而且有些类似,但是在解决方案下方可能会有所帮助,使用相当简单的正则表达式(假设您输入的格式与您的示例相同):

private static String replaceUrl(String inputUrl){
    String regex = "/.*(/login\\?token=.*)";
    String toUrl = "/tourl";
    Pattern p = Pattern.compile(regex);
    Matcher matcher = p.matcher(inputUrl);
    if (matcher.find()) {
        return toUrl + matcher.group(1);
    } else
        return null;
}

如果要更改格式并调整正则表达式,可以编写测试,如果它适用于其他预期的输入/输出:

    String inputUrl = "/fromurl/login?token=7c8Q8grW5f2Kz7RP1%2FWsqpVB%2FEluVOGfXQdW4I0v82siR2Ism1D8VCvEmKJr%2BKhHhicwPey0uIiTxN049Be8TNsypf";
    String expectedUrl = "/tourl/login?token=7c8Q8grW5f2Kz7RP1%2FWsqpVB%2FEluVOGfXQdW4I0v82siR2Ism1D8VCvEmKJr%2BKhHhicwPey0uIiTxN049Be8TNsypf";
    if (expectedUrl.equals(replaceUrl(inputUrl))){
        System.out.println("Success");
    }