java - 通过正则表达式删除维基文本超链接

标签 java regex hyperlink wiki 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);
    }
}

最佳答案

您可以使该部分直到管道可选:

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

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

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
\\]\\]

关于java - 通过正则表达式删除维基文本超链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29918472/

相关文章:

java - 将正则表达式应用于 str.split 方法时出现异常

java - 在 Java 中解析没有 DNS 查询的 URL

java - 使用 eclipselink jpa 出现未知列错误

arrays - 如何从 swift 5 中的正则表达式结果中删除括号?

javascript - 使用正则表达式匹配 Javascript 中的特定 URL

java - 如何在匿名内部类中使用外部变量

c# - 当不在一组引号内时匹配正则表达式模式(文本跨越多行)

html - 链接/悬停效果不适用于固定导航栏中页面的某些部分

html - "tel:"URL 在非移动浏览器上导致错误页面

html - 如何水平对齐一系列 HTML 链接?