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

Extract specific string by regular expression in Android

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

我想将我所有的 http://esupb.tabriz.ir:808x/srvSC.svc 放入数组 list.So 以便我像 blow 一样使用匹配器:

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);
}

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

根据要求,您的正则表达式将是

"(#\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;
}

你正则表达式 #\d+# 匹配 # 然后匹配一个或多个数字然后是另一个 # 。它不使用 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+#匹配#,一次或多次一个数字和另一个#
  • ) 关闭 caputring 组
  • $ 断言字符串结束