Есть ли регулярное выражение для удаления текста между тегами, содержащими определенное слово? - PullRequest
0 голосов
/ 04 июля 2019

Я сделал регулярное выражение для удаления текста между <FormattingRule и </FormattingRule>

Теперь я также хочу включить дополнительное условие: оно должно содержать EdtJobEmpId.

Может кто-нибудь помочьмне с этим?

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

<FormattingRule(.|\n)*?<\/FormattingRule>

Его можно найти на сайте: https://regex101.com/r/ttUMON/1

Я хочу удалить следующий текст на основе дополнительного условия:

        <FormattingRule Action="OnChange">
            <Triggers>
                <Trigger PropertyName="${EdtJobEmpId}" />
            </Triggers>
            <Choose>
                <When Condition="${EdtJobSkcId}==Empty">
                    <Assign PropertyName="${EdtJobSkcId.Value}" Value="=${EdtEmpSkcId.Value}" />
                </When>
            </Choose>
        </FormattingRule>

Ответы [ 3 ]

1 голос
/ 08 июля 2019

Вот как это делается.
Если вы думаете, что у вас возникнут проблемы, когда ваш html / xml имеет
конструкции, которые могут скрыть разметку, например Комментарии или CDATA (или что-то еще)
и вы беспокоитесь об этом, дайте мне знать, и я исправлю это
регулярное выражение с парой функций, чтобы поглотить этих плохих парней.

(?:<(?:(FormattingRule)(?:\s+(?>"[\S\s]*?"|'[\S\s]*?'|(?:(?!/>)[^>])?)+)?\s*>)(?:(?!</\1\s*>)[\S\s])*?EdtJobEmpId(?:[\S\s]*?</\1\s*>|(*SKIP)(*FAIL)))

https://regex101.com/r/Plih3R/1

Версия для чтения

 (?:
      <
      (?:
           (                             # (1 start), End tag req'd
                FormattingRule
           )                             # (1 end)
           (?:
                \s+ 
                (?>
                     " [\S\s]*? "
                  |  ' [\S\s]*? '
                  |  (?:
                          (?! /> )
                          [^>] 
                     )?
                )+
           )?
           \s* >
      )
      (?:
           (?! </ \1 \s* > )
           [\S\s] 
      )*?
      EdtJobEmpId
      (?:
           [\S\s]*? </ \1 \s* >
        |  
           (*SKIP)(*FAIL)
      )
 )
1 голос
/ 04 июля 2019

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

Правильный инструмент для этой работы - XSLT.

0 голосов
/ 08 июля 2019

Это регулярное выражение соответствует <FormattingRule> узлам, только если они содержат EdtJobEmpId:

(?m)<FormattingRule((?!/FormattingRule).)*EdtJobEmpId((?!/FormattingRule).)*\/FormattingRule>

См. live demo .

Работает с использованием-line "флаг (?m) и отрицательный прогноз (?!/FormattingRule), чтобы не совпадать вне текущего совпадающего тега.

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