我有类似这样的传入数据
http://localhost:1111/search?id=10&time=3200&type=abc
http://localhost:1111/search?time=3200&id=11&type=abc
http://localhost:1111/search?id=12
http://localhost:1111/search?id=13&time=3200&type=abc
数据不尽相同,但不是完全随机或不可预测的。
所以基本上我们如何提取每个字符串中传入的ID,忽略其余的垃圾?
答案 0 :(得分:2)
您可以尝试使用正则表达式id=(\d+)
并提取第一个capturing group的值:
String url = "http://localhost:1111/search?id=10&time=3200&type=abc";
Pattern id = Pattern.compile("id=(\\d+)");
Matcher m = id.matcher(url);
if (m.find())
System.out.println(m.group(1));
10
答案 1 :(得分:2)
如果有多个ID被传递(有效)怎么办?
恕我直言,我更愿意这样做:
URL url = new URL(<your link>);
String queryString = url.getQuery();
将queryString
解析为地图,例如<String,List<String>>
,并获取ID
键的值
答案 2 :(得分:1)
(?<=[?&])id=(\d+)(?=(?:\&|$))
在Java和Perl风格的Regex Buddy中工作,但在使用Boost正则表达式引擎的TextPad中没有。 Boost存在反向引用的问题。
(?<=(?:
[?&] //PRECEDED BY a question-mark or ampersand
))
id=(\d+) //"id=[one-or-more-digits]"
(?=(?:
\&|$ //FOLLOWED BY an ampersand or the end of the input
))
这仅捕获数字,并避免捕获诸如
之类的错误字段之类的问题anotherid=123sometext
答案 3 :(得分:1)
为什么要使用正则表达式来执行此操作?
我会这样做:
String url = "http://localhost:1111/search?id=13&time=3200&type=abc";
String[] split = url.split("&");
String id = "";
for (String s : split){
if (s.contains("id")){
id = s.substring(s.indexOf("id=")+3, s.length());
}
}
System.out.println(id);
13
答案 4 :(得分:1)
扩展@ user1631616的回答:
以下是示例代码:
public static void main(String[] args) throws MalformedURLException {
URL aURL = new URL("http://localhost:1111/search?id=10&time=3200&type=abc");
HashMap<String, String> params = new HashMap<>();
String[] query = aURL.getQuery().split("&");
for(String s: query) {
String[] split = s.split("=");
params.put(split[0],split[1]);
}
System.out.println(params.get("id"));
System.out.println(params.get("type"));
System.out.println(params.get("time"));
}
这样,如果您的HashMap参数返回 null ,您就知道未在查询字符串上设置该值。
并且也不必担心参数的排序。
答案 5 :(得分:0)
这样的事情应该做你想做的事情:
(?&LT = ID =)\ d +