正则表达式字符串不包含单词

时间:2017-09-28 15:05:36

标签: regex

我正在寻找一个匹配来自多行不包含某些单词/字符的字符串的正则表达式。

就我而言,它是用于重构HTML模板文件。我必须删除内嵌样式,除非它们包含display:none;$TEMPLATE_VARIABLE。为此,我试图使用来自Netbeans的正则表达式的搜索和替换功能。

我首先得到的是:

    style="[^"(?!\$)]*"

Regex Test 1这匹配所有不包含模板变量的样式声明,但遗憾的是包含display:none

经过一番研究后,我想出了以下内容:

    style="(?!display\s*:\s*none)[^"(?!\$)]*"

Regex Test 2这样可行,直到样式声明中的某些内容先于display:none样式。

尝试使用负面观察和前瞻的不同方法并不会带来成功。例如:

    style="(?!.*(\$|display)).*"

Regex Test 3这似乎乍一看但有几个问题:样式定义后面的其他HTML元素属性与样式定义匹配,如果在样式定义之后的某处使用了模板变量与那种风格不相称。

有没有人知道正则表达式必须如何看待它才能改变这个

    <span style="border: 1px solid red">Test</span>
    <form style="border: 1px solid black" method="POST">
        <span style="color:red; $TEMPLATE_VARIABLE"><span style="background-color:blue;" >Test</span>Test</span>
        <div style="display: none;">
            <span style="color: green; display: none;">Test</span>
            <span style="display: inline-block">Test $NOT_STYLING_TEMPLATE_VARIABLE</span>
        </div>
    </form>

进入这个?

    <span>Test</span>
    <form method="POST">
        <span style="color:red; $TEMPLATE_VARIABLE"><span>Test</span>Test</span>
        <div style="display: none;">
            <span style="color: green; display: none;">Test</span>
            <span">Test $NOT_STYLING_TEMPLATE_VARIABLE</span>
        </div>
    </form>

使用display:none或模板变量的其余样式将手动清除。

提前致谢!

1 个答案:

答案 0 :(得分:5)

您不应该使用正则表达式来解析HTML,但我会在正则表达式中回答它,因为您在正则表达式中指定了答案并且未指定任何其他语言。

此外,我建议将正则表达式中的\$更改为\$\w+,因为a[href$=".pdf"]是有效的CSS,您可能会神奇地捕捉到这样的内容(虽然我不确定如何,但我相信你可以有创意。它确实增加了一些预防措施。

P.S你的正则表达非常接近。在正则表达式.将匹配任何字符。我已将其更改为[^"],因为问题是.也在捕获"

代码

See this code in use here

\s*style="(?![^"]*(\$|display:\s*none))[^"]*"(?:\s*(?=>))?

结果

输入

<span style="border: 1px solid red">Test</span>
<form style="border: 1px solid black" method="POST">
    <span style="color:red; $TEMPLATE_VARIABLE"><span style="background-color:blue;" >Test</span>Test</span>
    <div style="display: none;">
        <span style="color: green; display: none;">Test</span>
        <span style="display: inline-block">Test $NOT_STYLING_TEMPLATE_VARIABLE</span>
    </div>
</form>

输出

<span>Test</span>
<form method="POST">
    <span style="color:red; $TEMPLATE_VARIABLE"><span>Test</span>Test</span>
    <div style="display: none;">
        <span style="color: green; display: none;">Test</span>
        <span>Test $NOT_STYLING_TEMPLATE_VARIABLE</span>
    </div>
</form>

说明

  • \s*任意次数匹配任何空格字符
  • style="按字面意思匹配此字符串
  • (?![^"]*(\$|display:\s*none))否定前瞻,确保后面的内容与以下内容不符
    • [^"]*匹配除"
    • 之外的任何字符
    • (\$|display:\s*none)匹配以下任一项
      • \$按字面意思匹配$
      • display:\s*none按字面意思匹配display:,后跟任意数量的空白字符,然后依次为none
  • [^"]*匹配除"
  • 之外的任何字符
  • "按字面意思匹配"
  • (?:\s*(?=>))?如果正前瞻为真,则可能匹配任何后续空白字符(如果后面的字符为>) - 当没有任何其他属性后,这将删除额外的空格