我正在尝试为我的客户端创建重定向网址。我们有一个您使用java正则表达式匹配器指定"fromUrl" -> "toUrl"
的服务。但是我无法让它在转换时包含令牌。例如:
/fromurl/login?token=7c8Q8grW5f2Kz7RP1%2FWsqpVB%2FEluVOGfXQdW4I0v82siR2Ism1D8VCvEmKJr%2BKhHhicwPey0uIiTxN049Be8TNsypf
应该是:
/tourl/login?token=7c8Q8grW5f2Kz7RP1%2FWsqpVB%2FEluVOGfXQdW4I0v82siR2Ism1D8VCvEmKJr%2BKhHhicwPey0uIiTxN049Be8TNsypf
但它排除了令牌,所以我得到的结果是:
/fromurl/login/
/tourl/login/
我尝试了各种正则表达式模式,例如:" ?.*
和[%5E//?]+)/([^/?]+)/(?.*)?$
以及(/*)
等等,但似乎没有人工作。
我对正则表达式并不熟悉。我该如何解决这个问题?
答案 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");
}