我试图从字符串中查找特定单词,但我无法找到精确匹配的正则表达式。 字符串可以动态更改为两种形式
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
答案 0 :(得分:1)
.*
会匹配任意字符零次或多次并且是贪婪的,并且您的正则表达式将匹配到字符串末尾。
您可以使用正向查找,然后使用否定的字符类[^&\n]+
一次或多次不匹配与号或换行符。您不必逃避等号。
(?<=token=)[^&\n]+
答案 1 :(得分:0)
如果您定义捕获组,则不需要后面的内容,这样可以更轻松地读取IMO。
还要注意,分号used to be是根据规范允许使用的URL参数分隔符,因此在匹配参数值时可能需要包括分号,以防需要支持较旧或不一致的平台:>
token=([^&;\n]+)
第二个匹配项应该是令牌本身。
答案 2 :(得分:0)
您可以使用spring-web UriComponentsBuilder
Link
或者您可以使用URIBuilder
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")
答案 3 :(得分:0)
如果格式始终是这两种格式之一,并且您不想特别使用regex
,则可以满足以下条件:
int val = str.indexOf("paymentid");
System.out.println(str.substring(str.indexOf("token"), (val != -1) ? val - 1 : str.length()));
当然,您也可以将val
替换为str.indexOf("paymentid")
,然后一行完成。
答案 4 :(得分:0)
如何使用正则表达式模式
[&?]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));
}