在Android中通过正则表达式提取特定字符串[duplicate]

问题描述 投票:-1回答:2

这个问题在这里已有答案:

我有这个字符串:https://regex101.com/r/7Er0Ch/6

我想把我所有的http://esupb.tabriz.ir:808x/srvSC.svc放到数组列表中。所以为了我用matcher像打击:

String regx= "#\\d+#";
Pattern pattern = Pattern.compile(regx);
Matcher matcher = pattern.matcher(url);
String[] metadata = new String[4];
while (matcher.find()) {
    metadata[0] = matcher.group(1);
    metadata[1] = matcher.group(2);
    metadata[2] = matcher.group(3);
    metadata[3] = matcher.group(4);
}

但我得不到合适的结果。我的错是什么?

android regex matcher
2个回答
1
投票

根据您的正则表达式的要求

“(#\ d +#)(HTTP [^#] * SVC)(#\ d +#)”

group(0): (#\\d+#)(http[^#]*svc)(#\\d+#)
group(1): (#\\d+#)
group(2): (http[^#]*svc)
group(3): (#\\d+#)

将您的代码更改为

List<String> urls = new ArrayList<>();

String url =
        "#1#http://test.com:8080/srv.svc#1# " +
                "#2#http://test.com:8081/srv.svc#2# " +
                "#3#http://test.com:8082/srv.svc#3# " +
                "#4#http://test.com:8083/srv.svc#4# " +
                "#5#http://test.com:8084/srv.svc#5# ";

String regx = "(#\\d+#)(http[^#]*svc)(#\\d+#)";
Pattern pattern = Pattern.compile(regx);
Matcher matcher = pattern.matcher(url);

int from = 0;
while (matcher.find(from)) {
    urls.add(matcher.group(2));
    from = matcher.start() + 1;
}

0
投票

你正则表达式#\\d+#matches #然后匹配一个或多个数字,然后另一个#。它不使用capturing groups

对于您的示例数据,您可以从字符串中获取remove that match,从而为您提供所需的结果,而不会匹配任何剩余字符串的模式。它也可以在字符串内匹配,而不是仅在开始和结束时匹配。

要匹配像http://esupb.tabriz.ir:808x/srvSC.svc这样的示例字符串,您可以使用正则表达式来匹配开始和结束,并在组中捕获它们之间的内容。

^#\d+#(https?://test.ir:808\d/srvSC\.svc)#\d+#$

在Java中

^#\\d+#(https?://test.ir:808\\d/srvSC\\.svc)#\\d+#$

Regex demo

Demo Java

说明

  • ^断言字符串的开头
  • #\d+#匹配#,一个或多个数字和另一个#
  • (开始捕捉小组 https?://test.ir:808\d匹配url的开头与可选的s s?和808之后的数字。使用\d+匹配一个或多个数字。 /srvSC\.svc匹配/srvSC.svc #\d+#匹配#,一个或多个数字和另一个#
  • qazxsw poi关闭捕获组
  • )断言字符串的结尾
© www.soinside.com 2019 - 2024. All rights reserved.