Regex Redirect URL исключает токен - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь создать URL перенаправления для моего клиента. У нас есть служба, которую вы указываете "fromUrl" -> "toUrl", которая использует Java Regex Matcher. Но я не могу заставить работать токен, когда он конвертирует его. Например:

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

Должно быть:

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

но он исключает токен, поэтому я получаю следующий результат:

/fromurl/login/

/tourl/login/

Я пробовал различные шаблоны регулярных выражений, такие как: " ?.* и [%5E//?]+)/([^/?]+)/(?.*)?$ и (/*) и т. Д. ", Но, похоже, никто не работает.

Я не очень знаком с регулярными выражениями. Как я могу решить это?

Ответы [ 4 ]

0 голосов
/ 26 апреля 2018

Хотя существующие ответы должны решить проблему, и некоторые из них похожи, может быть, поможет следующее решение, с довольно простым использованием регулярных выражений (при условии, что вы получите ввод того же формата, что и в вашем примере):

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");
    }
0 голосов
/ 26 апреля 2018

Это легко сделать с помощью простой замены строки, но если вы настаиваете на использовании регулярных выражений:

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);
0 голосов
/ 26 апреля 2018

Можете ли вы более подробно описать оригинальное выражение? Это необходимо, потому что регулярное выражение основано на нем.

Предполагая, что первое вхождение 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");
 }

NOTE : pre и pos цели являются ссылочными, потому что я не знаю реального выражения URL

ПРИМЕЧАНИЕ 2 : $ 1 и $ 3 относятся к первой и третьей группе

0 голосов
/ 26 апреля 2018

Если я вас правильно понимаю, вам нужно что-то подобное?

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

Это заменит все между первым и последним косой чертой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...