Регулярное выражение для вложенной группировки - PullRequest
1 голос
/ 19 марта 2020

В настоящее время я пытаюсь найти полезное выражение регулярного выражения для вложенной группировки.

Как выглядят мои текущие данные:

bundle=>test,value=>{amount=>0.00,country=>DE,currency=>EUR},humble=>test,card=>{type=>VISA,digits=>16,security=>645},data=>test

Поля очень сильно различаются. Значит, вложенное выражение может иметь одно поле или несколько.

Чего я хочу достичь:

bundle=>test,value.amount=>0.00,value.country=>DE,value.currency=>EUR,humble=>test,card.type=>VISA,card.digits=>16,card.security=>645,data=>test

Мое текущее выражение выглядит так:

,(.*?)\=>{(((.*?)\=>(.*?))(\,|}))

Я хочу все, что находится перед основным значением, например «значение» с выражением ,(.*?)\=>. Затем я пытаюсь получить значения между скобками {} с помощью ((.*?)\=>(.*?)), которые могут заканчиваться запятой (,) или скобкой (}).

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

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

Спасибо и наилучшими пожеланиями.

1 Ответ

0 голосов
/ 19 марта 2020

Это будет проще, если вы используете регулярное выражение вместе с языком программирования. Например, у меня есть код perl, который может выдать желаемый результат:

 while($input =~ /([\w\.]+?)=>\{([^\{\}]*?)\}/){
  $name = $1; 
  $content = $2; 
  @vals = split(',', $content);
  @newvals = ();
  foreach $v (@vals){
    $v =~ s/(.*?)(=>.+)/$name\.$1$2/;
    push(@newvals, $v);
  }
  $final = join(',', @newvals);

  $input =~ s/([\w\.]+?)=>\{([^\{\}]*?)\}/$final/;
}
print $input;

Ввод:

bundle=>test,value=>{amount=>0.00,country=>DE,currency=>EUR},humble=>test,card=>{type=>VISA,digits=>16,security=>645},data=>{test=>{x=>34,y=>44}}

Выход:

bundle=>test,value.amount=>0.00,value.country=>DE,value.currency=>EUR,humble=>test,card.type=>VISA,card.digits=>16,card.security=>645,data.test.x=>34,data.test.y=>44
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...