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

时间:2019-07-04 14:03:14

标签: regex xml pcre conditional-formatting

我做了一个正则表达式来删除<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 个答案:

答案 0 :(得分:1)

没有正则表达式每次都能正确得到100%。例如,大多数尝试都将被注释,CDATA,节以及源中的实体或字符引用之类的东西击败。

适合此作业的工具是XSLT。

答案 1 :(得分:1)

这是完成的方式。
如果您认为自己会在html / xml存在的地方遇到问题
可能会隐藏标记的结构,例如 Comments或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)
      )
 )

答案 2 :(得分:0)

此正则表达式仅在<FormattingRule>个节点中包含EdtJobEmpId时才匹配:

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

请参见live demo

通过使用“多行”标志(?m)和否定超前(?!/FormattingRule)来使之与当前匹配的标记不匹配而起作用。