2014-01-07 3 views
0

У меня есть что-то входящие данные, как этотJava Regex шаблон для извлечения данных

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 

Данные меняющегося но не что-то совершенно случайным или непредсказуемым.

Итак, как же мы извлекаем, какие идентификаторы, входящие в каждую строку, игнорируют остальную часть нежелательной почты?

+3

Использовать парсер URL? –

+0

@DaveNewton, я дал образцы данных. Это не точные данные.:) Более или менее такое же явление – Reddy

+0

Тогда вводить в заблуждение, чтобы показывать только URL-адреса. Не зная каких-либо ограничений данных, сложно дать конкретные рекомендации. –

ответ

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 

См Pattern и Matcher.

+1

Это потрясающе. Просто работает. Я всегда думал, что Pattern работает по-другому, когда нам нужно включить сложный шаблон регулярного выражения :) – Reddy

+0

@Reddy Регулярное выражение, которое вы хотите, кажется довольно простым :) Рад, что я мог бы помочь. – arshajii

+0

@arashajii, еще одна помощь, если я хочу извлечь «тип»? Я попробовал подобное, не работает. – Reddy

1

(?<=[?&])id=(\d+)(?=(?:\&|$))

работает в Regex Бадди под вкус Java и Perl, но не в 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 
2

Что делать, если есть несколько идентификаторов, которые передаются (что справедливо)?

ИМХО wouild, а сделать somethis больше, как это:

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

разборе queryString в карту для примера <String,List<String>> и получить значение ID ключа

+0

+1 Это путь – gtgaxiola

0

Что-то, как это должно делать то, что вы хотите:

(? < = id =) \ d +

1

Почему именно вы nt использовать регулярное выражение для этого?

Я хотел бы сделать это следующим образом:

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); 
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")); 

} 

Tha t, если ваш HashMap param возвращает null Вы знаете, что значение не было установлено в строке запроса.

А также не нужно беспокоиться о заказе параметров.

 Смежные вопросы

  • Нет связанных вопросов^_^