是否有正则表达式来删除包含特定单词的标签之间的文本

Is there a regex expression to remove text between tags containing a specific word

我制作了一个正则表达式来删除 <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>

没有正则表达式每次都能 100% 正确。例如,大多数尝试都会被源代码中的注释、CDATA 部分以及实体或字符引用等内容所击败。

完成这项工作的正确工具是 XSLT。

这是完成的方式。
如果您认为自己会 运行 遇到 html/xml 有
的问题 可以隐藏标记的构造,例如 Comments 或 CDATA(或其他任何东西)
如果您对此感到担心,请告诉我,我会对此进行修补
具有几个函数的正则表达式可以消耗那些坏男孩。

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

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

可读版本

 (?:
      <
      (?:
           (                             # (1 start), End tag req'd
                FormattingRule
           )                             # (1 end)
           (?:
                \s+ 
                (?>
                     " [\S\s]*? "
                  |  ' [\S\s]*? '
                  |  (?:
                          (?! /> )
                          [^>] 
                     )?
                )+
           )?
           \s* >
      )
      (?:
           (?! </  \s* > )
           [\S\s] 
      )*?
      EdtJobEmpId
      (?:
           [\S\s]*? </  \s* >
        |  
           (*SKIP)(*FAIL)
      )
 )

此正则表达式仅匹配 <FormattingRule> 个包含 EdtJobEmpId:

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

live demo

它的工作原理是使用 "multi-line" 标志 (?m) 和否定前瞻 (?!/FormattingRule) 不匹配当前匹配标签之外的内容。