Regex не работает, извлекая пары ключ-значение

1

Мне нужно создать словарь с ключевыми парами значений на основе следующей строки в качестве примера (youtube info_videos):

состояние = нормально & use_cipher_signature = False & allow_ratings = 1 & iurlmaxres = HTTP% 3A% 2F% 2Fi.ytimg.com% 2Fvi% 2F5MwJobjESqw% 2Fmaxresdefault.jpg & allow_embed = 1 & водяного знака =% 2Chttp% 3A% 2F% 2Fs.ytimg.com% 2Fyts% 2Fimg% 2Fwatermark% 2Fyoutube_watermark -vflHX6b6E.png% 2Chttp% 3A% 2F% 2Fs.ytimg.com

Проблема в том, что мое регулярное выражение не работает все время:

String pattern = "&(.+?)=(.+?)&.+?";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(decodedUrl);
Multimap<String, String> map = HashMultimap.create();
while(m.find()) {            
    map.put(URLDecoder.decode(m.group(1), "UTF-8"), URLDecoder.decode(m.group(2), "UTF-8"));
}

Мне нужна помощь с моим регулярным выражением в java.

  • 1
    Что вы пытаетесь захватить?
  • 0
    Тебе лучше разделить на, & потом на = .
Теги:
dictionary
youtube

4 ответа

1

Я нахожу, что у hwnd был лучший ответ, потому что быстрее делать это отрицание [^ =] +, и он избегает использования ленивых операторов.

Это может быть немного легче без ^ для начала:

&?([^=]+)=([^&]+)

демонстрация

1

Вы можете использовать следующее регулярное выражение.

(?:^|&)([^=]+)=([^&]+)
0
(.*?)=(.*?)(?=(?:&)|($))&?

Вы можете использовать это.

См. Демонстрацию.

http://regex101.com/r/iX8hF3/6

0

Я думаю, вам нужно что-то подобное,

&(.+?)=(.+?)(?=&|$)

DEMO

Вышеупомянутое регулярное выражение будет захватывать пару ключевых значений в двух отдельных группах. Предполагается, что ключевому слову должен предшествовать символ & а значение должно сопровождаться символом & или конце строки. Используйте lookahead, чтобы проверить, следует ли за значением значение & или $.

Если вы хотите захватить первую пару status=ok также попробуйте следующее регулярное выражение,

(?<=&|^)(.+?)=(.+?)(?=&|$)

DEMO

Ещё вопросы

Сообщество Overcoder
Наверх
Меню