2012-10-11 1 views
1

Можно создать дубликат:
Wikipedia : Java library to remove wikipedia text markup removalJava регулярное выражение, чтобы очистить Mediawiki разметке

Я должен очистить некоторое содержание, которое исходит от Confluence. Это содержание почти чистое; Однако, есть некоторые вещи, как:

  1. [ссылка |]: Ссылка без URL-адрес части
  2. * [ссылка |] *: Ссылка (без URL-адрес части) жирного
  3. * текст *: Bolded текст
  4. _ * текст * _: курсивный текст жирным шрифтом

И так далее. мне нужно написать регулярное выражение, очистить все, что так, я сделал что-то вроде:

String wikiCleanMarkupRegex = "\\\\[(.*?)[\\\\|.*?]?\\\\]|\\\\*(.*?)\\\\*|_(.*?)_";

Но это не чистое все, я имею в виду, если я дам ему ссылку в # 2, я получите:

[ссылка |]

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

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

Большое спасибо.

+0

Также , если у меня есть что-то вроде \ _ \ * \ [link | \] \ * \ _: ссылка (без части url) выделена жирным шрифтом и курсивом, мне нужно будет ее разобрать 3 раза, один - удалите курсив, другой, чтобы удалить полужирный и последний, чтобы удалить скобки ... это слишком медленно для того, что мне нужно – user1739166

ответ

0

Так выглядит, что в основном три типа форматирования кода: наклонным, полужирный и LINK

я сделаю 3-пасс Regex заменителя.

и порядок старшинства в соответствии с входом вы дали должны быть:

/** 
* FIRST REMOVE ITALICS, THEN BOLD, THEN URL 
*/ 
public static String cleanWikiFormat(CharSequence sequence) { 
    return Test.removeUrl(Test.removeBold(Test.removeItalic(sequence))); 
} 

Вот пример кода:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 


public class Test { 

    private static String removeItalic(CharSequence sequence) { 
     Pattern patt = Pattern.compile("_\\*(.+?)\\*_"); 
     Matcher m = patt.matcher(sequence); 
     StringBuffer sb = new StringBuffer(sequence.length()); 
     while (m.find()) { 
      String text = m.group(1); 
      // ... possibly process 'text' ... 
      m.appendReplacement(sb, Matcher.quoteReplacement(text)); 
     } 
     m.appendTail(sb); 
     return sb.toString(); 
    } 

    private static String removeBold(CharSequence sequence) { 
     Pattern patt = Pattern.compile("\\*(.+?)\\*"); 
     Matcher m = patt.matcher(sequence); 
     StringBuffer sb = new StringBuffer(sequence.length()); 
     while (m.find()) { 
      String text = m.group(1); 
      // ... possibly process 'text' ... 
      m.appendReplacement(sb, Matcher.quoteReplacement(text)); 
     } 
     m.appendTail(sb); 
     return sb.toString(); 
    } 


    private static String removeUrl(CharSequence sequence) { 
     Pattern patt = Pattern.compile("\\[(.+?)\\|\\]"); 
     Matcher m = patt.matcher(sequence); 
     StringBuffer sb = new StringBuffer(sequence.length()); 
     while (m.find()) { 
      String text = m.group(1); 
      // ... possibly process 'text' ... 
      m.appendReplacement(sb, Matcher.quoteReplacement(text)); 
     } 
     m.appendTail(sb); 
     return sb.toString(); 
    } 


    public static String cleanWikiFormat(CharSequence sequence) { 
     return Test.removeUrl(Test.removeBold(Test.removeItalic(sequence))); 
    } 

    public static void main(String[] args) { 
     String text = "[hello|] this is just a *[test|]* to clean wiki *type* and _*formatting*_"; 
     System.out.println("Original"); 
     System.out.println(text); 
     text = Test.cleanWikiFormat(text); 
     System.out.println("CHANGED"); 
     System.out.println(text); 
    } 
} 

Следующие даст:

Original 
[hello|] this is just a *[test|]* to clean wiki *type* and _*formatting*_ 
CHANGED 
hello this is just a test to clean wiki type and formatting