【问题标题】: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");
}
注意:pre和pos目标是参考的,因为我不知道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");
}