Мне нужно создать словарь с ключевыми парами значений на основе следующей строки в качестве примера (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.
Я нахожу, что у hwnd был лучший ответ, потому что быстрее делать это отрицание [^ =] +, и он избегает использования ленивых операторов.
Это может быть немного легче без ^ для начала:
&?([^=]+)=([^&]+)
Вы можете использовать следующее регулярное выражение.
(?:^|&)([^=]+)=([^&]+)
(.*?)=(.*?)(?=(?:&)|($))&?
Вы можете использовать это.
См. Демонстрацию.
Я думаю, вам нужно что-то подобное,
&(.+?)=(.+?)(?=&|$)
Вышеупомянутое регулярное выражение будет захватывать пару ключевых значений в двух отдельных группах. Предполагается, что ключевому слову должен предшествовать символ &
а значение должно сопровождаться символом &
или конце строки. Используйте lookahead, чтобы проверить, следует ли за значением значение &
или $
.
Если вы хотите захватить первую пару status=ok
также попробуйте следующее регулярное выражение,
(?<=&|^)(.+?)=(.+?)(?=&|$)
&
потом на=
.