2015-03-11 3 views
1

У меня есть следующая строка:Regexp матч до

{"name":"db-mysql","authenticate":false,"remove":false,"skip":false,"options":{"create":{"Image":"mysql:5.6/image-name:0.3.44","Env":{"MYSQL_ROOT_PASSWORD":"dummy_pass","MYSQL_DATABASE":"dev_db"}}}} 

Мне нужно, чтобы получить версию: 0.3.44

картина всегда будет "Image": "XXX: YYY/ZZZ: VVV "

Любая помощь будет принята с благодарностью

Rubular link

+3

Любые причины отказа от использования JSON API? – anubhava

+0

Если вы настаиваете на использовании регулярных выражений, то работает следующее: «Изображение»: «(. *?): (. *?) \/(. *?): (. *?)". [Рублевая ссылка] (http://www.rubular.com/r/3OMTYfAnT4). – Phylogenesis

+1

It * иногда * работает. – ikegami

ответ

2

Это регулярное выражение будет надежно соответствовать заданной «образец» в любой строке и захватить группа обозначена VVV:

/"Image":"[^:"]+:[^"\/]+\/[^":]+:([^"]+)"/ 

, где образец понимается, чтобы выразить следующие характеристики входного сигнала, совпадения:

  • нет пробелов вокруг толстой кишки между "Image" и последующим " (хотя это с ould будет соответствовать небольшой настройке);
  • XXX и ZZZ подстроки содержат любые двоеточия;
  • Подстрока YYY не содержит косую черту (/); и
  • ни один из подстрок XXX, YYY, ZZZ или VVV не содержит буквального двойной кавычки ("), или не убежали.

Поскольку эти ограничения более сильные, чем JSON или YAML, для того чтобы выразить данные, вам, вероятно, было бы лучше использовать использование добросовестного анализатора JSON/YAML. Настоящий парсер будет справляться с семантически эквивалентными входами, которые не удовлетворяют ограничениям, и он распознает недействительные (в смысле JSON или YAML) входы, содержащие шаблон. Однако, если это вас не волнует, тогда регулярное выражение выполнит эту работу.

+0

@ikegami, примеры? –

+0

Мне хорошо, я собирался опубликовать «Изображение»: «[^:] *: [^ \ /] * \/[^:] *: [^"] * "', что немного меньше Строго. Зависит от того, что действительно хочет OP. Использование regex в этом случае не так уж и просто .. [rubular link] (http://www.rubular.com/r/uQVKXmdcOd) – Daniel

+0

Не так быстро, @ikegami. конкретные критерии, которые квалифицируют мое утверждение о том, что регулярное выражение является надежным. Признание неисправного JSON не является обязательным требованием. Поддержка строковых разделителей, отличных от '' ', не является обязательным требованием. Пожалуйста, подтвердите свою претензию примером ввода, который удовлетворяет этим ограничениям и который регулярное выражение ложно совпадает или неправильно не соответствует. –

1

Это Extrem ely трудно сделать правильно, используя только регулярное выражение, и для этого потребуется механизм регулярных выражений, способный к рекурсии. Вместо того, чтобы писать 50 строк регулярного выражения, я бы просто использовал существующий парсер JSON.

$ perl -MJSON::PP -E' 
    use open ":std", ":encoding(UTF-8)"; 
    my $json = <>; 
    my $data = JSON::PP->new->decode($json); 
    my $image = $data->{options}{create}{Image}; 
    my %versions = map { split(/:/, $_, 2) } split(/\//, $image); 
    say $versions{"image-name"}; 
' my.json 
0.3.44 
Смежные вопросы