2015-11-17 11 views
0

У меня есть s строка, как этотИзвлечение данных из строки с регулярным выражением

"Country": "FRANCE", "PostalCode": "01, 02, 03" 

Когда я использую это регулярное выражение:

"(.*)": "(.*)" 

Система вернуть мне только один матч с 2-мя группами

MATCH 1 
1. [1-32] `Country": "FRANCE", "PostalCode` 
2. [36-70] `01, 02, 03` 

Что я делаю неправильно? Я хотел бы получить любое значение соответствия, и у меня может быть много «ххх»: токен «yyy», разделенный запятой. Так что моя строка может также быть

"Country": "FRANCE", "PostalCode": "01, 02, 03", "Xxxxx": "yy", "Aaaaa5": "b", "Mmmmmmm": "n1, n2, n3-n30" 
+0

Поиск [ ' "([^" \\] * (?:. \\ [^ \\ "] *) *)" \ S *: \ S *" ([^ "\\] * (?: \\ [^ \\".] *) *) "'] (https://regex101.com/r/qE0zB3/1)? –

+0

На каком языке вы используете? –

+0

Я не хочу связывать этот вопрос с конкретным языком. –

ответ

1
$s = '"Country": "FRANCE", "PostalCode": "01, 02, 03"'; 
REGEX = '/\"([^\"]+)\"\s*\:\s*\"([^\"]+)\"/'; 
preg_match_all(REGEX, $s, $res); 
print_r($res); 
+1

Этот вариант лучше, и это тот, который будет выбран, если исходные строки не могут содержать экранированные кавычки внутри. –

+0

Просто FYI: нет необходимости избегать толстой кишки в любом выражении regex, о котором я знаю (если это не разграничение регулярных выражений, конечно :)). –

1

Используйте это: "(.*?)": "(.*?)" вместо как вы хотите меньшую группу, как это возможно.

enter image description here

+0

Я бы не использовал это. Это (почти) такое же регулярное выражение, которое я разместил в своем комментарии, но в стиле ленивой точки, который неэффективен. Кроме того, он будет терпеть неудачу с «Модель»: «Некоторое» имя модели «здесь». –

+1

Мое решение - простой способ, учитывая то, что он будет иметь внутри своих данных, конечно, это не единственное решение, но оно работает в большинстве случаев;) –

+1

Да, это хорошее решение для студентов, а не для использования в производстве. –

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