1

Java に次の関数があります。これは、文字列コメントを受け取り、コメントを返しますが、末尾のすべての#文字とその後ろ#にスペースがあるすべての文字を削除し、複数の隣接するハッシュタグのシーケンス ( など) を###単一の#文字に置き換えます。これはコード部分です

private static String replaceHashTagsAndPunctuation(String comment) {
// Remove trailing '#' values
comment = comment.replaceAll("#*$", "");

// Replace instances of multiple '#' values with one '#'
comment = comment.replaceAll("#+", "#");


// Remove punctuation
comment = comment.replaceAll("[^a-zA-Z0-9 #]", "");

// Remove all hashtags that have no word after them
comment = comment.replaceAll("# ", "");

return comment;
}

これは信じられないほど冗長で醜いです。だから私の質問は次のとおりです。
より良い正規表現ステートメントを使用してこれを書き直して、文字列のこれらの部分をすべて1行または2行で削除するにはどうすればよいですか?
また、あなたが提案した正規表現コードが機能する理由についての説明は、Java で正規表現がどのように機能するかをよりよく理解するのに役立ちます。

4

4 に答える 4

1

アイデア1

2 つの呼び出しを置き換えるには、次のようにします。

comment = comment.replaceAll("#+([ #])", $1);

末尾のスペースをそのままにしておくと、2 つとは少し異なります。

comment = comment.replaceAll("#+", "#");
comment = comment.replaceAll("# ", "");

あなたの言葉は「スペースの後に # を削除する」と言っていましたが、スペースを削除するとは言っていないため、末尾のスペースを削除することが重要かどうかはわかりません。ただし、コードはそれを削除します。

アイデア2

多少複雑になりますが、そのうちの 3 つは次の方法で処理できます。

comment = comment.replaceAll("#+([ #]|$)", $1);

説明する

2 番目のパラメーターの$1は、一致した文字列を、括弧内の部分と一致した部分に置き換えることを意味します。

[ #]、スペースまたは番号記号のいずれかを意味します。

一緒に[# ]|$、スペース、番号記号、または文字列の末尾を意味します。

于 2013-05-31T17:37:52.660 に答える
1

コード自体に問題はありませんが、因数分解されている可能性があります。

例えば:

// LinkedHashMap: insertion order matters!
private static final Map<Pattern, String> REPLACEMENTS
    = new LinkedHashMap<Pattern, String>();

static {
    Pattern pattern;
    String replacement;

    pattern = Pattern.compile("#*$");
    replacement = "";
    REPLACEMENTS.put(pattern, replacement);

    pattern = Pattern.compile("#+");
    replacement = "#";
    REPLACEMENTS.put(pattern, replacement);

    // etc
}

次に、コードは次のようになります。

private static String replaceHashTagsAndPunctuation(final String comment)
{
    String ret = comment;

    for (final Map.Entry<Pattern, String> entry: REPLACEMENTS.entrySet())
        ret = entry.getKey().matcher(ret).replaceAll(entry.getValue());

    return ret;
}
于 2013-05-31T17:45:07.660 に答える