0

我有这样的传入数据

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,而忽略其余的垃圾?

4

6 回答 6

2

您可以尝试使用正则表达式id=(\d+)并提取第一个捕获组的值:

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

PatternMatcher

于 2014-01-07T16:40:47.320 回答
2

如果传递了多个 ID(这是有效的)怎么办?

恕我直言,我宁愿做一些这样的事情:

URL url = new URL(<your link>);
String queryString = url.getQuery();

解析queryString为 map 例如<String,List<String>>并获取IDkey的值

于 2014-01-07T16:43:45.023 回答
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
于 2014-01-07T16:42:29.467 回答
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

于 2014-01-07T16:49:31.483 回答
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,您就知道查询字符串上没有设置该值。

而且也不必担心参数的顺序。

于 2014-01-07T16:51:37.547 回答
0

这样的事情应该做你想做的事:

(?<=id=)\d+

于 2014-01-07T16:44:23.957 回答