2012-10-11 4 views
1

Possible en double:
Wikipedia : Java library to remove wikipedia text markup removaljava regex pour effacer les balises MediaWiki

Je dois nettoyer une partie du contenu qui vient de Confluence. Ce contenu est presque propre; Cependant, il y a des choses comme:

  1. [lien |]: Un lien sans la partie url
  2. * [lien |] *: Un lien (sans la partie url) en gras
  3. texte * *: texte en gras
  4. _ * _ * texte: italic texte en gras

Et ainsi de suite. Je dois écrire un regex qui nettoient tout cela, donc, je l'ai fait quelque chose comme:

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

Mais tout cela ne pas propre, je veux dire, si je lui donne le lien dans # 2, je obtenez:

[link |]

ce qui est pas ce que je veux, je veux « lien » ... donc, je dois réanalyser la chaîne encore et encore jusqu'à ce qu'aucun autre match se trouve.

Ceci est vraiment lent car il y a des millions d'enregistrements à nettoyer, donc, est-il possible de faire une regex qui fait tout en même temps?

Merci beaucoup.

+0

également , si j'ai quelque chose comme \ _ \ * \ [link | \] \ * \ _: Un lien (sans la partie url) en gras et en italique, je vais devoir l'analyser 3 fois, enlever l'italique, autre pour enlever le gras et le dernier pour enlever les parenthèses ... c'est trop lent pour ce dont j'ai besoin – user1739166

Répondre

0

Comme il semble que est essentiellement trois types de mise en forme de code: italic, gras et LINK

Je vais faire un 3-pass Regex succédané.

et l'ordre de priorité en fonction de l'entrée que vous avez donné doit être:

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

Voici un exemple de code:

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

Ce qui suit donnera:

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 
Questions connexes