2015-04-28 3 views
1

Есть два различных вида вики-текст гиперссылка:Удалить вики-текст гиперссылка с помощью регулярных выражений

[[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); 
    } 
} 

ответ

2

Вы можете сделать часть до трубы необязательной:

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

И чтобы быть уверенным, вы всегда находитесь между квадратными скобками, используйте классы символов.

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