Java正则表达式在字符串中查找单词模式

时间:2018-09-16 09:06:57

标签: java regex

我试图从字符串中查找特定单词,但我无法找到精确匹配的正则表达式。 字符串可以动态更改为两种形式

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 :(得分:1)

.*会匹配任意字符零次或多次并且是贪婪的,并且您的正则表达式将匹配到字符串末尾。

您可以使用正向查找,然后使用否定的字符类[^&\n]+一次或多次不匹配与号或换行符。您不必逃避等号。

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

Regex demo

答案 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));
}