代码之家  ›  专栏  ›  技术社区  ›  Mikhail

使用基于regex的Java添加html标记,保持数据匹配

  •  1
  • Mikhail  · 技术社区  · 14 年前

    使用java,我正在编写一个脚本来锚定链接html书目。那就要开始了 发件人: [1,2] <a href="o100701.html#bib1">[1, 2]</a>

    我想我找到了正确的正则表达式: \[.*?\]

    这是我能想到的最多的了

    while(myScanner.hasNext())
    {
     line = myScanner.nextLine();
     myMatcher = myPattern.matcher(line);
     ...
     outputBufferedWritter.write(line+"\n");
    }
    

    文件不是很大,而且几乎总是少于100个匹配项,所以我不关心性能。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Community CDub    7 年前

    首先我认为一个更好的模式来匹配 [tag] 内容是 [\[\]]* 而不是 .*? (即除了开括号和闭括号以外的任何内容)。

    [标签] Matcher.find() 回路与 appendReplacement/Tail .

    Map<String,String> 的URL和 更换回路:

        Map<String,String> hrefs = new HashMap<String,String>();
        hrefs.put("[1,2]", "one-two");
        hrefs.put("[3,4]", "three-four");
        hrefs.put("[5,6]", "five-six");
    
        String text = "p [1,2] \nq [3,4] \nr [5,6] \ns";
    
        Matcher m = Pattern.compile("\\[[^\\[\\]]*\\]").matcher(text);
        StringBuffer sb = new StringBuffer();
        while (m.find()) {
            String section = m.group(0);
            String url = String.format("<a href='%s'>%s</a>",
                hrefs.get(section),
                section
            );
            m.appendReplacement(sb, url);
        }
        m.appendTail(sb);
    
        System.out.println(sb.toString());
    

    p <a href='one-two'>[1,2]</a> 
    q <a href='three-four'>[3,4]</a> 
    r <a href='five-six'>[5,6]</a> 
    s
    

    请注意 没有 StringBuilder 超载,所以 StringBuffer 必须使用。

    相关问题