2

我正在使用当前表达式将纯文本超链接(如 http 或 https)转换为 html 超链接

String pattern = "(?:https|http)://([^\\s\\|]+)";

但是,在将通过此正则表达式模式的消息内容中,我的内容如下[video]http://www.yahoo.com[video].

对于在两个视频括号之间的此类内容。我不希望它被转换为 html 超链接,因为它会显示在页面上。

如何解决这个问题?

4

1 回答 1

3

(?<!...)使用and使用负前瞻和后瞻(?!...)

String link = "(?:https|http)://([^\\s\\|]+)";
String pattern = "(?<!\\[video\\])" + link + "(?!\\[video\\])";

Pattern p = Pattern.compile(pattern);
System.out.println(p.matcher("[video]http://www.yahoo.com[video]").matches());
System.out.println(p.matcher("http://www.yahoo.com").matches());

输出:

false
true

完整示例:

public static void main(String... args) {

    Pattern pattern = Pattern.compile(
            "(?<!\\[video\\])(?:https|http)://([^\\s\\|]+)(?!\\[video\\])");

    String text = "This is some example text with a link" +
        "[video]http://videolink[video] that should not be replaced" + 
        "and another link that should be" +
        "replaced http://www.example.com";

    Matcher m = pattern.matcher(text);

    StringBuffer sb = new StringBuffer();
    while (m.find())
        m.appendReplacement(sb, "<a href=\""+m.group()+"\">"+m.group() +"</a>");
    m.appendTail(sb);

    System.out.println(sb);
}

输出:

这是一些示例文本,其中包含不应替换的链接 [video]http://videolink[video] 和应替换的另一个链接http://www.example.com

于 2012-06-04T06:10:51.377 回答