2014-01-24 3 views
0

Мне нужна группа захвата, которая вернет мне inner1: и inner2: между фигурными фигурными скобками, но outter:.Захватывающие группы внутри фигурных скобок

outter: value 
{ inner1: value, inner2: value, ... } 

Я попробовал это; \{.*?(\w*\:).*\}, и я получил только первый inner1:. Какую модель следует использовать, чтобы вернуть остальные группы между фигурными фигурными скобками?

ответ

1

Это похоже на синтаксис JSON. почему бы просто не сериализовать его в объект JSON или словарь и извлечь на основе ключей?

+0

Похоже, что JS ON, но это не так, и мне нужно жестко закодированное регулярное выражение, потому что у меня нет такой опции, как сериализация этих кодов в объект JSON. –

1

Это, как представляется, захватить inner1: и inner2:

^\{\s*(?:(\w+:)\s*\w+\s*,?\s*)+\s*\}$ 

EDIT: немного изменен, это показывает, что он фиксирует значения, когда я использую экспрессо, чтобы проверить это.

+0

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

+0

Обновлено, я также использую Expresso для тестирования, и он захватывает оба. Это одно и то же совпадение, но оно должно содержать несколько значений. На каком языке вы это используете? – CaffGeek

+0

Это Python, но прямо сейчас он не захватывает какую-либо группу вообще, хотя и чувствует себя хорошо. –

0

Если ваши данные хорошо сформированы json, вы можете использовать json-парсер.

Другой способ - использовать простой шаблон для извлечения всего содержимого внутри фигурных скобок {([^}]++)} и разделить результат.

полный регулярное выражение так: (работа с неопределенным количеством ключ/значение)

(?>{|\G(?<!\A):[^,}]++,)\s*([^:]++) 

результат в группе захвата 1

модели детали:

(?>   # atomic group: all that can be before the key 
    {   # literal: { 
    |   # OR 
    \G(?<!\A) # contiguous to a precedent match but not a the start of the string 
    :[^,}]++, # a : followed by all that is not a , or } followed by a , 
)    # close the atomic group 
\s*   # possible spaces 
([^:]++)  # capture group 1: all that is not a : 

пример :

text = <<EOF 
outter: value 
{ inner1: value, inner2: value, inner3: val } 
EOF 

puts text.scan(/(?>{|\G(?<!\A):[^,}]++,)\s*([^:]++)/) 
Смежные вопросы