包含x且不包含y的行的子字符串

时间:2014-07-03 16:36:09

标签: regex notepad++ dreamweaver

我正在尝试搜索和替换HTML代码,以根据现有的name属性添加缺少的ID属性。在互联网上搜索,我已经成功地拼凑了以下内容:

搜索:

name=("(.*?)")

替换为:

id=$1 name=$1

通过将替换字符串中的$更改为\,这在Dreamweaver的搜索和替换或Notepad ++中非常有效。

我无法完成的是一点过滤。我想忽略已经有id属性的行,可能还有另外一个或两个条件。我们将为每个替换眼球,所以我拥有的是宜居的,但我真的很感激一些帮助,使它更有效。

1 个答案:

答案 0 :(得分:0)

由于您必须只处理没有id属性的标记,因此需要确保从标记的开头到结尾不存在id属性。为此,您可以使用此搜索替换:

  

搜索: (<\w+\s+(?:[^ni>]|\B[ni]|n(?!ame\s*=)|i(?!d\s*=))*)(name\s*=\s*("[^"]+")(?:[^i>]|\Bi|i(?!d\s*=))*>)
     替换: $1id=$3 $2

我们的想法是使用字符类来禁止name或id属性以及标记的结尾,直到目标属性(对于第一个非捕获组)并且直到标记结束(对于第二个非捕获组)在目标属性之后。

注意:此模式根本不处理单引号或引号,但可以用name\s*=\s*("[^"]+")替换name\s*=\s*["']?([^"'\s])["']?。在这种情况下,替换模式变为$1id="$3" $2。这是管理属性引用的基本方法,但它应该有效。

<强>词汇表:

(?:...)非捕获组

\w字符字符类:等同于[a-zA-Z0-9_]

(?!...)否定前瞻:后面没有

\B非字边界:来自\w类的两个字符之间或两个不属于\w

<强> Demo