RegEx для замены значения каждого дочернего узла - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь выяснить, как использовать RegEx для замены дочернего узла T на n="upper_bound" для любого вхождения родительского узла T со значением n="Key" 32305 таким образом, чтобы Я могу заменить <T n="upper_bound">10</T> на <T n="upper_bound">ANY_NEW_VALUE_HERE</T>

Я также предпочел бы оставить комментарии.

Пример фрагмента в формате XML:

<U>
    <T n="key">32304<!--Key for Y--></T>
    <U n="value">
      <T n="upper_bound">20</T>
    </U>
</U>
<U>
    <T n="key">32305<!--Key for X--></T>
    <U n="value">
      <T n="upper_bound">10</T>
    </U>
</U>

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Я понимаю, что вы не были довольны быстрым пренебрежением, которое вы перенесли в качестве первой реакции.

Причина, по которой Ян был так короток в своем ответе, заключается, вероятно, в том, что в тот момент, когда вы задали свой вопрос, он не знал, что вы говорите о регулярном выражении в NotePad ++.

Поскольку Правильный способ изменить файл XML не через регулярные выражения, мы устали повторять это разработчикам, которые посещают SO. Извините за это.

Теперь, если вы хотите изменить файл XML, включая приведенный выше фрагмент, с помощью скрипта, правильный путь:

xmlstarlet edit \
  --update '//U/T[@n="key" and text()="32305"]//following-sibling::U' \
  --value 'ANY_NEW_VALUE_HERE' input.xml

Вы получите результат, который вы хотели в качестве стандартного вывода. Также возможно изменить файл напрямую с помощью опции --inplace.

1 голос
/ 28 апреля 2020

Не случайно, что это неправильный путь, так как я смог понять это двумя способами. Я уверен, что есть более изящный способ сделать это, но он подходит для моей области, так как я могу делать предположения о непосредственном родительском узле.

PCRE RegEx:

(<T n="key">32305<!--Key for X--><\/T>\n        <U n="value">\n          <T n="upper_bound">).*(<\/T>)

Подстановка:

$1NEW_VALUE_HERE$2

Он заменяет значение между двумя группами.

С помощью NotePad ++ RegEx я могу искать весь жестко закодированный текст, и, в моем случае, я могу предположить, что значение для узла, который я ищу, это 2-ди git число

<T n="key">32305<!--Key for X--></T>
    <U n="value">
      <T n="upper_bound">\d\d</T>

Заменить на:

<T n="key">32305<!--Key for X--></T>\n\t\t<U n="value">\n\t\t\t<T n="upper_bound">NEW_VALUE_HERE</T>

Надеюсь, это кому-нибудь поможет, и меня заинтересуют другие решения, кроме быстрого пренебрежительного комментария, с которым меня встретили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...