【问题标题】:Extract specific string by regular expression in Android [duplicate]在Android中通过正则表达式提取特定字符串[重复]
【发布时间】:2018-09-16 17:57:19
【问题描述】:

我有这个字符串: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


【解决方案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;
}

【讨论】:

    【解决方案2】:

    你正则表达式#\\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+# 匹配#,一个或多个数字和另一个#
    • )关闭捕获组
    • $断言字符串结束

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 2021-05-24
      • 2017-04-12
      • 1970-01-01
      • 2018-06-02
      • 2020-07-13
      相关资源
      最近更新 更多