这个问题在这里已有答案:
我有这个字符串: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);
}
但我得不到合适的结果。我的错是什么?
根据您的正则表达式的要求
“(#\ 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+#
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+#$
说明
^
断言字符串的开头#\d+#
匹配#,一个或多个数字和另一个#(
开始捕捉小组
https?://test.ir:808\d
匹配url的开头与可选的s s?
和808之后的数字。使用\d+
匹配一个或多个数字。
/srvSC\.svc
匹配/srvSC.svc
#\d+#
匹配#,一个或多个数字和另一个#)
断言字符串的结尾