【问题标题】:Getting value of $1 from matcher.replaceAll()从 matcher.replaceAll() 获取 $1 的值
【发布时间】:2011-09-11 22:21:55
【问题描述】:

在我的应用程序中,如果它大于 10(示例)字符,我需要获取链接并断开它。 问题是,如果我将整个文本,例如:“这是我的网站 www.stackoverflow.com”直接发送到这个匹配器

Pattern patt = Pattern.compile("(?i)\\b((?:https?://|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'\".,<>???“”‘’]))");
Matcher matcher = patt.matcher(text);  



matcher.replaceAll("<a href=\"http://$1\" target=\"_blank\">$1</a>");

它将显示整个网站,而不会破坏它。

我试图做的是获得 1 美元的价值,所以我可以打破第二个,保持第一个正确。

我还有另一种方法可以拆线。

更新

我想要的只是网站,所以我毕竟可以破坏它。这对我有很大帮助。

【问题讨论】:

  • 我见过的最糟糕的正则表达式。
  • 我不确定我能否理解您的目标。您能否发布示例输入和预期输出?
  • 如果您只是简单地将您从字符串中提取的 http 部分输出到一个变量,然后通过一个单独的函数将该变量分成 10 个字符片段,而不是继续添加到如果可能的话,该正则表达式并在一行中完成。事实上,我不敢相信您正在认真考虑如何添加到该模式。

标签: java regex matcher


【解决方案1】:

我认为你和这个问题中提到的有类似的问题

Java : replacing text URL with clickable HTML link

他们提出了类似的建议

String basicUrlRegex =  "(.*://[^<>[:space:]]+[[:alnum:]/])"; 
myString.replaceAll(basicUrlRegex, "<a href=\"$1\">$1</a>");

【讨论】:

    【解决方案2】:

    你不能使用replaceAll;您应该遍历匹配项并单独处理每个匹配项。 Java 的 Matcher 已经为此提供了一个 API

     // expanding on the example in the 'appendReplacement' JavaDoc:
     Pattern p = Pattern.compile("..."); // your URL regexp
     Matcher m = p.matcher(text);
     StringBuffer sb = new StringBuffer();
     while (m.find()) {
         String truncatedURL = m.group(1).replaceFirst("^(.{10}).*","$1..."); // i iz smrt
         m.appendReplacement(sb,
             "<a href=\"http://$1\" target=\"_blank\">"); // simple replacement for $1
         sb.append(truncatedURL);
         sb.append("</a>");
     }
     m.appendTail(sb);
     System.out.println(sb.toString());
    

    (为了提高性能,您应该为循环内的 replace* 调用考虑已编译的模式。)

    编辑:使用 sb.append() 这样就不用担心在 'truncatedURL' 中转义 $ 和 \。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 2017-04-25
      • 2020-11-01
      • 1970-01-01
      相关资源
      最近更新 更多