你可以尝试这样的事情:
final Pattern pattern = Pattern.compile("^#EXT-X-STREAM-INF:.*BANDWIDTH=(\\d+).*RESOLUTION=([\\dx]+).*");
Matcher matcher = pattern.matcher("#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=476416,RESOLUTION=416x234");
String bandwidth = "";
String resolution = "";
if (matcher.find()) {
bandwidth = matcher.group(1);
resolution = matcher.group(2);
}
将带宽和分辨率设置为正确的(字符串)值。
我还没有在 Android 设备或模拟器上尝试过这个,但从您发送的链接和 Android API 来看,它应该与上面的普通旧 java.util.concurrent.java 一样工作。
正则表达式匹配以以下开头的字符串#EXT-X-STREAM-INF:
并包含BANDWIDTH
and RESOLUTION
接下来是正确的值格式。然后将它们在反向引用组 1 和 2 中反向引用,以便我们可以提取它们。
Edit:
如果 RESOLUTION 并不总是存在,那么您可以将该部分设为可选,如下所示:
"^#EXT-X-STREAM-INF:.*BANDWIDTH=(\\d+).*(?:RESOLUTION=([\\dx]+))?.*"
The resolution
字符串将是null
在只有BANDWIDTH
存在。
Edit2:
?
使事情成为可选的,并且(?:___)
表示被动组(与反向引用组相对)(___)
。所以它基本上是一个可选的被动组。所以是的,里面的任何东西都是可选的。
A .
匹配单个字符,并且*
make 表示它将重复零次或多次。所以.*
将匹配零个或多个字符。我们需要这个的原因是消耗我们匹配的任何东西,例如之间的任何东西#EXT-X-STREAM-INF:
and BANDWIDTH
。有很多方法可以做到这一点,但是.*
是最通用/最广泛的一种。
\d
基本上是一组代表数字的字符(0-9
),但是由于我们将字符串定义为 Java 字符串,因此我们需要 double\\
,否则Java编译器会因为无法识别转义字符而失败\d
(爪哇语)。相反,它会解析\\
into \
这样我们就得到\d
在传递给的最终字符串中Pattern
构造函数。
[\dx]+
表示一个或多个字符(+
) 字符之外0-9
and x
. [\dx\d]
将是单个字符(没有+
)来自同一组字符。
如果您对正则表达式感兴趣,可以查看正则表达式.info http://www.regular-expressions.info/tutorial.html or/and regexone.com http://regexone.com/,在那里您将找到所有问题的更深入的答案。