JAVA REGEX:匹配直到特定字符

时间:2018-08-14 06:56:32

标签: java android regex

我有这个Java代码

String cookies = TextUtils.join(";",  LoginActivity.msCookieManager.getCookieStore().getCookies());
Log.d("TheCookies", cookies);
Pattern csrf_pattern = Pattern.compile("csrf_cookie=(.+)(?=;)");
Matcher csrf_matcher = csrf_pattern.matcher(cookies);
while (csrf_matcher.find()) {
    json.put("csrf_key", csrf_matcher.group(1));
    Log.d("CSRF KEY", csrf_matcher.group(1));
}

字符串包含以下内容:

SessionID=sessiontest;csrf_cookie=e18d027da2fb95e888ebede711f1bc39;ci_session=3f4675b5b56bfd0ba4dae46249de0df7994ee21e

我正在尝试使用此正则表达式获取csrf_cookie数据:

csrf_cookie=(.+)(?=;)

我希望在代码中得到这样的结果:

csrf_matcher.group(1);

e18d027da2fb95e888ebede711f1bc39

相反,我得到一个:

3492f8670f4b09a6b3c3cbdfcc59e512;ci_session=8d823b309a361587fac5d67ad4706359b40d7bd0

该问题可能解决的方法是什么?

2 个答案:

答案 0 :(得分:3)

这是使用String#replaceAll的单线纸:

String input = "SessionID=sessiontest;csrf_cookie=e18d027da2fb95e888ebede711f1bc39;ci_session=3f4675b5b56bfd0ba4dae46249de0df7994ee21e";
String cookie = input.replaceAll(".*csrf_cookie=([^;]*).*", "$1");
System.out.println(cookie);

e18d027da2fb95e888ebede711f1bc39

Demo

注意:我们本可以使用正式的正则表达式模式匹配器,并且如果您需要经常在代码中执行此搜索/替换操作,那么您可能想这样做。

答案 1 :(得分:2)

由于使用贪婪的'+'(它将尽可能匹配),因此您获得的数据超出了预期。

例如,模式a+可以在aaa上匹配以下内容:aaaaaa。如果模式是贪婪的,则优先选择后者。

所以您要匹配

csrf_cookie=e18d027da2fb95e888ebede711f1bc39;ci_session=3f4675b5b56bfd0ba4dae46249de0df7994ee21e;

,只要以“;”结尾。首先 ';' .+和最后一个';'被跳过被预先发现

使用+?而不是+来使模式变得不贪婪/懒惰(因此a+?将与a字符串上的aaa匹配csrf_cookie=(.+?);(三次))< / p>

所以尝试:

csrf_cookie=([^;]*);

或仅匹配非';'

{{1}}

那样,您无需变得懒惰。