1

重複の可能性:
ウィキペディア : ウィキペディアのテキスト マークアップを削除するための Java ライブラリ

Confluence からのコンテンツをクリーンアップする必要があります。その内容はほとんどクリーンです。ただし、次のようなものがあります。

  1. [link|]: url 部分のないリンク
  2. *[link|]*: 太字のリンク (URL 部分を除く)
  3. *テキスト*: 太字のテキスト
  4. _*text*_: 斜体の太字のテキスト

等々。それをすべてきれいにする正規表現を書く必要があるので、次のようなことをしました:

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

しかし、それですべてがきれいになるわけではありません。つまり、#2 のリンクを指定すると、次のようになります。

[リンク|]

これは私が望んでいるものではありません。「リンク」を取得したいので、他の一致が見つからなくなるまで、文字列を何度も再解析する必要があります。

何百万ものレコードを消去する必要があるため、これは非常に遅いです。すべてを一度に実行する正規表現を実行する方法はありますか?

どうもありがとう。

4

1 に答える 1

0

これは、基本的に 3 種類のコード形式 ( italicbold、およびLINK ) に見えるためです。

3 パスの正規表現の置き換えを行います。

入力に応じた優先順位は次のようになります。

/**
 * 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
于 2012-10-11T20:18:45.847 に答える