我做了一个正则表达式来删除<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>
答案 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)
来使之与当前匹配的标记不匹配而起作用。