我有这个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
该问题可能解决的方法是什么?
答案 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
注意:我们本可以使用正式的正则表达式模式匹配器,并且如果您需要经常在代码中执行此搜索/替换操作,那么您可能想这样做。
答案 1 :(得分:2)
由于使用贪婪的'+'(它将尽可能匹配),因此您获得的数据超出了预期。
例如,模式a+
可以在aaa
上匹配以下内容:a
,aa
和aaa
。如果模式是贪婪的,则优先选择后者。
所以您要匹配
csrf_cookie=e18d027da2fb95e888ebede711f1bc39;ci_session=3f4675b5b56bfd0ba4dae46249de0df7994ee21e;
,只要以“;”结尾。首先 ';' .+
和最后一个';'被跳过被预先发现
使用+?
而不是+
来使模式变得不贪婪/懒惰(因此a+?
将与a
字符串上的aaa
匹配csrf_cookie=(.+?);
(三次))< / p>
所以尝试:
csrf_cookie=([^;]*);
或仅匹配非';'
{{1}}
那样,您无需变得懒惰。