正则表达式排除行为

时间:2010-07-28 15:57:05

标签: java regex string pattern-matching

好的,所以我知道这个问题已经多次以不同的形式提出,但是我遇到了特定语法的问题。我有一个包含html片段的大字符串。我需要找到每个没有target =属性的链接标记(这样我就可以根据需要添加一个)。

^((?!target).)*会向我发送指向“目标”的文字,<a.+?>[\w\W]+?</a>会给我一个链接,但那就是我被困住的地方。一个例子:

<a href="http://www.someSite.com>Link</a> (This should be a match)
<a href="SomeLink.whatever target="_blank">Link</a> (this should not be a match).  

有什么建议吗?使用DOM或XPATH不是真正的选项,因为这个片段不是格式良好的html。

4 个答案:

答案 0 :(得分:2)

通过尝试使用Regexes解析HTML,你是故意的。不。

那就是说,你试图在一个正则表达式中做所有事情,这是多么邪恶。没有必要;它使您的代码依赖于引擎依赖引擎,不可读,并且可能很慢。相反,只需匹配标签,然后使用简单的正则表达式/target=/再次检查您的第一阶段匹配。当然,这个字符串可能出现在HTML标签的其他地方,但是看看(1)......你已经抛弃了良好的做法,所以为什么不至少让事情变得模糊,这样每个人都可以看到你的'干嘛?

答案 1 :(得分:0)

如果你坚持用Regex这样做,这样的模式应该有帮助......

<a(?![^>]*target=) [^>]*>.*?</a>

从技术上讲,它绝不是100%完美的标签可以包含&gt;在除此之外的其他位置,因此它不适用于所有HTML标记。

NB。我使用PHP,您可能需要对Java进行轻微的语法调整。

答案 2 :(得分:0)

您可以尝试这样的负面预测: <a(?!.*?target.*?).*?>[\w\W]+?</a>

答案 3 :(得分:0)

我没有对此进行测试并花了大约一分钟编写它,但对于您的具体示例,如果您可以在客户端执行此操作,请通过DOM尝试:

var links = document.getElementsByTagName("a");

for (linkIndex=0; linkIndex < links.length; linkIndex++) {
    var link = links[linkIndex];

    if (link.href && !link.target) {
        link.target = "someTarget"
        // or link.setAttribute("target", "someTarget");
    }
}