我有一个这样的字符串:
RTSP/1.0 200 OK
CSeq: 3
Server: Ants Rtsp Server/1.0
Date: 21 Oct 2016 15:55:30 GMT
Session: 980603187; timeout=60
Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=F006B800
我想提取会话编号(980603187
)
有人可以提供一些帮助吗?
答案 0 :(得分:5)
只需在组中使用regular expression
,然后将组的值提取为下一个:
String content ="RTSP/1.0 200 OK\n" +
"CSeq: 3\n" +
"Server: Ants Rtsp Server/1.0\n" +
"Date: 21 Oct 2016 15:55:30 GMT\n" +
"Session: 980603187; timeout=60\n" +
"Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=F006B800\n";
Pattern pattern = Pattern.compile("Session: ([a-zA-Z0-9$\\-_.+]+)");
Matcher matcher = pattern.matcher(content);
if (matcher.find()) {
System.out.println(matcher.group(1));
}
<强>输出:强>
980603187
<强>解释强>
Session: ([a-zA-Z0-9$\\-_.+]+)
Session:
字面匹配字符Session:
(区分大小写)([a-zA-Z0-9$\\-_.+]+)
:捕获与多个连续的ALPHA,DIGIT或SAFE字符匹配的组(至少一个)(cf RFC 2326 chapter 3.4 Session Identifiers)答案 1 :(得分:2)
使用正则表达式!拥有String str = ..
,提取正则表达式在Session:
和;
之间捕获任何内容所需的数字:
Session: (.+);
可以只指定字母\\w+
或数字\\d+
。注意Java中的双重转义。第一个匹配的m.group(1)
是您的结果:
Pattern p = Pattern.compile("Session: (.+);");
Matcher m = p.matcher(str);
if (m.find()) {
System.out.println(m.group(1));
}
输出980603187
。请查看Regex101以获取解释。
在以下情况下,; timeout
是可选的,需要修改使用的正则表达式:
Session: (.+?)[\n;]
答案 2 :(得分:2)
获得每个标头后,您可以在RFC 2336中查找指定RTSP协议的规范。
首先,您应该将字符串拆分为多行。根据规范,线以CR / LF结束。第一行表示响应,另一行表示标题字段。
定义是:
Session = "Session" ":" session-id [ ";" "timeout" "=" delta-seconds ]
其中session-id
指定为:
session-id = 1*( ALPHA | DIGIT | safe )
这意味着你不应该把它与数字混淆。安全的定义是
safe = "\$" | "-" | "_" | "." | "+"
和alpha表示所有大写和小写的数字。这意味着顺便说一下,可以放入一个base 64 url编码的二进制session-id。
好的,现在它成了寻找会话ID的问题。您遍历所有行(第一行除外),然后查找匹配的行:
^Session[ \t]*:[ \t]*([a-zA-Z0-9\$\-_.+]+).*$
这将仅匹配有效的会话标头/有效会话标识符。请注意,标准对于空格是模糊的,所以我在冒号':'之前和之后跳过了空格和制表符。然后,会话标识符位于正则表达式的第1组中。
当然,一旦需要,您可以通过在正则表达式中包含超时来轻松扩展它。
请注意,在Java中使用正则表达式之前,必须双重转义反斜杠字符。也可以使用Pattern
类中定义的Posix字符类来使正则表达式更具可读性。
答案 3 :(得分:0)
如果在依赖项中使用apache-commons,则可以在一行内完成:
StringUtils.substringBetween(string, "Session: ", ";");