Java регулярное выражение, чтобы найти шаблон слова в строке - PullRequest
0 голосов
/ 16 сентября 2018

Я пытался найти конкретное слово из строки, но я не смог найти точное соответствие регулярному выражению. Строка может быть динамически изменена в двух формах

https://www.test.com/vgi-bin/tmpscr?cmd=_temp-out&useraction=commit&token=EC-1J942953KU425764F

https://www.test.com/vgi-bin/tmpscr?cmd=_temp-out&useraction=commit&token=EC-1J942953KU425764F&paymentid=PAY-12345K4776H687987R

Мне нужно найти шаблон, чтобы получить значение токен . Я пытался с этим регулярным выражением (?<=token\=).* Я смог получить токен из первой строки, но не во второй. Вывод должен быть как ниже.

EC-1J942953KU425764F

Ответы [ 5 ]

0 голосов
/ 18 сентября 2018

Как насчет использования шаблона регулярных выражений

[&?]token=([^&\r\n]*)

Затем просто извлеките группу захвата 1

String regex = "[&?]token=([^&\r\n]*)";
String input =
        "https://www.test.com/vgi-bin/tmpscr?cmd=_temp-out&useraction=commit&token=EC-1J942953KU425764F\n" +
        "https://www.test.com/vgi-bin/tmpscr?cmd=_temp-out&useraction=commit&token=EC-1J942953KU425764F&paymentid=PAY-12345K4776H6879";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while(matcher.find())
{
    System.out.printf("Token is %s%n", matcher.group(1));
}
0 голосов
/ 17 сентября 2018

Если формат всегда один из этих двух, и вы специально не хотите использовать regex, тогда может быть достаточно чего-то подобного:

int val = str.indexOf("paymentid");
System.out.println(str.substring(str.indexOf("token"), (val != -1) ? val - 1 : str.length()));

Или, конечно, вы можете заменить val с str.indexOf("paymentid") и сделать это в одну строку.

0 голосов
/ 16 сентября 2018

.* соответствует любому символу ноль или более раз и является жадным, и в вашем регулярном выражении будет совпадать до конца строки.

Вы можете использовать свой положительный взгляд сзади, а затем сопоставлять не амперсанд илиперевод строки один или несколько раз с использованием класса отрицанных символов [^&\n]+.Вам не нужно выходить из знака равенства.

(?<=token=)[^&\n]+

Regex demo

0 голосов
/ 17 сентября 2018

Вместо этого вы можете использовать spring-web UriComponentsBuilder

String url = "https://www.test.com/vgi-bin/tmpscr?cmd=_temp-out&useraction=commit&token=EC-1J942953KU425764F&paymentid=PAY-12345K4776H687987R";
MultiValueMap<String, String> queryParams =
        UriComponentsBuilder.fromUriString(url).build().getQueryParams();
queryParams.get("token")

или вы можете использовать URIBuilder

List<NameValuePair> queryParams = new URIBuilder(url)
                .getQueryParams();
0 голосов
/ 16 сентября 2018

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

Также обратите внимание, что точка с запятой раньше была разрешенным разделителем параметров URL в соответствии со спецификацией, поэтому вы можете захотеть включить его при сопоставлении значений параметров на случай, если вам потребуется поддержка более старых или несовместимых платформа:

token=([^&;\n]+)

Вторым совпадением должен быть сам токен.

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