【问题标题】:Remove wikitext hyperlinks via regex通过正则表达式删除 wikitext 超链接
【发布时间】:2015-07-07 05:56:55
【问题描述】:

有两种不同类型的 wikitext 超链接:

[[stack]]
[[heap (memory region)|heap]]

我想删除超链接但保留文本:

stack
heap

目前,我正在运行两个阶段,使用两个不同的正则表达式:

public class LinkRemover
{
    private static final Pattern
    renamingLinks = Pattern.compile("\\[\\[[^\\]]+?\\|(.+?)\\]\\]");

    private static final Pattern
    simpleLinks = Pattern.compile("\\[\\[(.+?)\\]\\]");

    public static String removeLinks(String input)
    {
        String temp = renamingLinks.matcher(input).replaceAll("$1");
        return simpleLinks.matcher(temp).replaceAll("$1");
    }
}

有没有办法将两个正则表达式“融合”成一个,达到相同的结果?

如果你想检查你提出的解决方案的正确性,这里有一个简单的测试类:

public class LinkRemoverTest
{
    @Test
    public void test()
    {
        String input = "A sheep's [[wool]] is the most widely used animal fiber, and is usually harvested by [[Sheep shearing|shearing]].";
        String expected = "A sheep's wool is the most widely used animal fiber, and is usually harvested by shearing.";
        String output = LinkRemover.removeLinks(input);
        assertEquals(expected, output);
    }
}

【问题讨论】:

    标签: java regex hyperlink wiki wikitext


    【解决方案1】:

    您可以使零件直到管道可选:

    \\[\\[(?:[^\\]|]*\\|)?([^\\]]+)\\]\\]
    

    为了确保您始终位于方括号之间,请使用字符类。

    fiddle(点击 Java 按钮)

    图案细节:

    \\[\\[         # literals opening square brackets
    (?:            # open a non-capturing group
        [^\\]|]*   # zero or more characters that are not a ] or a |
        \\|        # literal |
    )?             # make the group optional
    ([^\\]]+)      # capture all until the closing square bracket
    \\]\\]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 2010-10-23
      • 2010-10-31
      相关资源
      最近更新 更多