【问题标题】:Regex Redirect URL excludes token正则表达式重定向 URL 不包括令牌
【发布时间】:2018-04-26 13:57:37
【问题描述】:

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

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

应该是:

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

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

/fromurl/login/

/tourl/login/

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

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

【问题讨论】:

标签: java regex url redirect token


【解决方案1】:

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

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】:

    如果我理解正确,您需要这样的东西吗?

    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";
    

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

    【讨论】:

      【解决方案3】:

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

      假设第一次出现的 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");
       }
      

      注意prepos目标是参考的,因为我不知道url的真实表达

      注意 2:$1 和 $3 指的是第一组和第三组

      【讨论】:

        【解决方案4】:

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

        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");
            }
        

        【讨论】:

          猜你喜欢
          • 2013-03-06
          • 2020-03-28
          • 2017-01-05
          • 1970-01-01
          • 2012-09-29
          • 1970-01-01
          • 1970-01-01
          • 2015-10-02
          • 1970-01-01
          相关资源
          最近更新 更多