2015-12-11 3 views
0

Я пытаюсь соответствовать такого рода последовательности символов:Regex содержание синтаксического анализа запроса HTTP

sender=11&receiver=2&subject=3&message=4 
sender=AOFJOIA&receiver=p2308u48302rf0&subject=(@#UROJ)(J#OFN:&message=aoefhoa348!!! 

Где разделители между (ключ, вал) пара является «&» характер. Я хотел бы сгруппировать их таким образом, чтобы получить доступ к ключу и значению каждой пары.

Я пытался что-то вроде:

([[:alnum:]]+)=([[:alnum:]]+) 

Но я скучаю:

subject=(@#UROJ)(J#OFN: 

Я не мог найти способ, чтобы разрешить эти типы символов, которые будут приняты. Чтобы быть более конкретным, если есть n пары значений ключа, я хотел бы иметь n совпадений, каждая из которых состоит из 2 групп - 1 для ключа, 1 для значения.

Я был бы рад, если бы вы мне помогли.

Благодаря

+4

Почему? Не было бы проще использовать парсер запросов? Не говорю, что у вас нет законной необходимости делать это, но ... это довольно редко. –

+0

subject = (@ # UROJ) (J # OFN: в основном специальные символы, которые 'alnum' не покрывает –

+0

RegEx cant parse html правильно – cutzero

ответ

0

Все специальные символы в вашем примере попадают унтер группу «пунктуации», см:

https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

Если это все еще не достаточно, вы можете попробовать сделать свой собственный знак regex класс. Как [@ # и т. Д.]. Имейте в виду, что вам придется избегать специальных символов java с дополнительным /.

1

https://regex101.com/r/hN7qG9/1

Я думаю, что будет решить вашу проблему:?

/([?^= &] +) (= ([^ &] *))/Ig

выход:

отправителя = 11
приемника = 2
Заголовок = 3
сообщения = 4
отправитель = AOFJOIA
приемника = p2308u48302rf0
Заголовок = (@ # UROJ) (J # ОФНО:
сообщения = aoefhoa348 !! !

и вы можете Асесс каждый скороговоркой:

$1 - first pattern (sender) 
$2 - second pattern (=11) 
$3 - second pattern without '='(11) 

reference

var string = 'sender=11&receiver=2&subject=3&message=4' 
 
var string2 = 'sender=AOFJOIA&receiver=p2308u48302rf0&subject=(@#UROJ)(J#OFN:&message=aoefhoa348!!!'; 
 

 
var regex = /([^?=&]+)(=([^&]*))?/ig; 
 
var eachMatche = string.match(regex); 
 

 
for (var i = 0; i < eachMatche.length; i++) { 
 
    snippet.log(eachMatche[i]); 
 
    snippet.log('First : '+eachMatche[i].replace(regex,'$1')); 
 
    snippet.log('Second : '+eachMatche[i].replace(regex,'$3')); 
 
} 
 
var eachMatche = string2.match(regex); 
 
for (var i = 0; i < eachMatche.length; i++) { 
 
    snippet.log(eachMatche[i]); 
 
    snippet.log('First : '+eachMatche[i].replace(regex,'$1')); 
 
    snippet.log('Second : '+eachMatche[i].replace(regex,'$3')); 
 
}
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+0

@johni вы можете видеть мои Ответ: Я думаю, что это решит вашу проблему ... –

0
String req = "sender=AOFJOIA&receiver=p2308u48302rf0&subject=(@#UROJ)(J#OFN:&message=aoefhoa348!!!"; 
    Pattern p = Pattern.compile("([\\w]+)=([^&]+)"); 
    Matcher m = p.matcher(req); 

    while (m.find()){ 
     System.out.println("key = " + m.group(1)); // key 
     System.out.println("value = " + m.group(2)); // value 
    } 

Вы должны определить свою собственную ч класс aracter для группы «значение» пары ключ/значение. Например, это может быть [\w!"#$%'()*+,-./:;<=>[email protected][]^_`{|}~] или [\[email protected]()#:!] или так же просто, как указано ниже: [^&]. Я думаю [^&] Символьный класс является наиболее подходящим, так как вы не знаете всех возможных символов, которые могут быть в «значении».

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