Java Regex Pattern提取数据

时间:2014-01-07 16:34:44

标签: java regex data-extraction

我有类似这样的传入数据

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

6 个答案:

答案 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

请参阅PatternMatcher

答案 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 +