Не в состоянии выбрать правильные данные - PullRequest
0 голосов
/ 27 февраля 2020

Мне передали наследство xml, которое не изменится. В форматированном виде это выглядит так:

<Result>
    <StepSequence>
      <RealMeasure>
        <Text value="Batman"/>
      </RealMeasure>
    </StepSequence>
    <StepSequence>
      <RealMeasure>
        <Text value="Superman"/>
      </RealMeasure>
    </StepSequence>
</Result>

На самом деле это выглядит так:

<Result><StepSequence><RealMeasure><Text value="Batman"/></RealMeasure></StepSequence><StepSequence><RealMeasure><Text value="Superman"/></RealMeasure></StepSequence></Result>

Regex, который я придумал, это:

<RealMeasure><((\w*)\s+value="(.*)".*?)></RealMeasure>

Но он выбирает данные:

<RealMeasure><Text value="Batman"/></RealMeasure></StepSequence><StepSequence><RealMeasure><Text value="Superman"/></RealMeasure>

Я хочу выбрать: <RealMeasure><Text value="Batman"/></RealMeasure>

и

<RealMeasure><Text value="Superman"/></RealMeasure>

Я хочу получить группы так что позже я смогу преобразовать совпадение во что-то вроде: <RealMeasure type="Text" value="Superman"/>

используя шаблон типа:

<RealMeasure type="$2" value=$3>

Ссылка на онлайн-тестер регулярных выражений

Любые советы по улучшению моего регулярного выражения?

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

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

<RealMeasure><(\w+).*?("[^"]*").*?<\/RealMeasure>

, и он, кажется, делает именно то, что вы хотите.

Тест здесь . Подробные пояснения приведены в правой части страницы.

Обратите внимание, что используемое программное обеспечение может накладывать некоторые ограничения на функции регулярного выражения, которые вы можете использовать.

В качестве альтернативы используйте правильный XML синтаксический анализатор для извлечения и переформатирования данных.

enter image description here

1 голос
/ 27 февраля 2020

Попробуйте это -

let reg = /<RealMeasure><((\w+)\s+value="(.*?)".*?)><\/RealMeasure>/g;
let str= `<Result><StepSequence><RealMeasure><Text value="Batman"/></RealMeasure></StepSequence><StepSequence><RealMeasure><Text value="Superman"/></RealMeasure></StepSequence></Result>`;
str.replace(reg, `<RealMeasure type="$2" value="$3"/>`); //<Result><StepSequence><RealMeasure type="Text" value="Batman"/></StepSequence><StepSequence><RealMeasure type="Text" value="Superman"/></StepSequence></Result>

Группа value="(.*?)" также должна быть нежадной. И изменил (\w*) на (\w+), чтобы тип не был пустым.

Кроме того, / в </RealMeasure> необходимо экранировать, как <\/RealMeasure>.

...