在 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+#$
说明
^
断言字符串的开始
#\d+#
匹配#,一次或多次一个数字和另一个#
(
开始抓包
https?://test.ir:808\d
匹配 url 的开头和可选的 s s?
和 808 之后的数字。使用 \d+
匹配一个或多个数字。
/srvSC\.svc
匹配/srvSC.svc
#\d+#
匹配#,一次或多次一个数字和另一个#
)
关闭 caputring 组
$
断言字符串结束
我有这个字符串: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+#$
说明
^
断言字符串的开始#\d+#
匹配#,一次或多次一个数字和另一个#(
开始抓包https?://test.ir:808\d
匹配 url 的开头和可选的 ss?
和 808 之后的数字。使用\d+
匹配一个或多个数字。/srvSC\.svc
匹配/srvSC.svc#\d+#
匹配#,一次或多次一个数字和另一个#
)
关闭 caputring 组$
断言字符串结束