3

特殊文字を削除しようとしている一連のリンク名があります。簡単なファイルウォークから、私の最大の懸念は角かっこ、かっこ、コロンのようです。SELECT: [とへのエスケープ文字との格闘に失敗した後(、代わりに、ファイル名に保持したいすべてのものを除外することにしました。

検討:

String foo = inputFilname ;   //SAMPLE DATA: [Phone]_Michigan_billing_(automatic).html
String scrubbed foo = foo.replaceAll("[^a-zA-Z-._]","") ;

期待される結果:Phone_Michigan_billing_automatic.html

私がそれを捨てたとき、私のエスケープ文字の正規表現は60文字に近づいていました。戦略を変更する前に保存した最後のバージョンは、私が求めていたと思っ[:.(\\[)|(\\()|(\\))|(\\])]た場所でした。escape-character-[()]

ブランケット除外は問題なく機能するようです。正規表現は本当に簡単ですか?この戦略がどれほど効果的かについての意見はありますか?何かが足りないような気がして、2、3の目が必要です。

4

3 に答える 3

1

私の意見では、あなたはこの仕事に間違ったツールを使用しています。 StringUtils には、出現する char をすべて別のものに置き換えるreplaceChars という名前のメソッドがあります。ドキュメントは次のとおりです。

public static String replaceChars(String str,
                              String searchChars,
                              String replaceChars)

Replaces multiple characters in a String in one go. This method can also be used to delete characters.

For example:
replaceChars("hello", "ho", "jy") = jelly.

A null string input returns null. An empty ("") string input returns an empty string. A null or empty set of search characters returns the input string.

The length of the search characters should normally equal the length of the replace characters. If the search characters is longer, then the extra search characters are deleted. If the search characters is shorter, then the extra replace characters are ignored.

 StringUtils.replaceChars(null, *, *)           = null
 StringUtils.replaceChars("", *, *)             = ""
 StringUtils.replaceChars("abc", null, *)       = "abc"
 StringUtils.replaceChars("abc", "", *)         = "abc"
 StringUtils.replaceChars("abc", "b", null)     = "ac"
 StringUtils.replaceChars("abc", "b", "")       = "ac"
 StringUtils.replaceChars("abcba", "bc", "yz")  = "ayzya"
 StringUtils.replaceChars("abcba", "bc", "y")   = "ayya"
 StringUtils.replaceChars("abcba", "bc", "yzx") = "ayzya"

あなたの例では:

    String translated = StringUtils.replaceChars("[Phone]_Michigan_billing_(automatic).html", "[]():", null);
    System.out.println(translated);

出力します:

Phone_Michigan_billing_automatic.html

これは、記述できる正規表現よりも簡単で理解しやすいものです。

于 2013-02-01T16:53:51.403 に答える
1

あなたの正規表現が道だと思います。一般に、ブラック リストではなくホワイト リストの値の方がほとんどの場合優れています。(悪いと思われるすべての文字を削除するのではなく、知っている文字のみを許可するのが適切です) セキュリティの観点から、この正規表現を優先する必要があります。無効な文字を含む inputFilename になることはありません。

suggested regex: [^a-zA-Z-._]
于 2013-02-01T19:51:06.800 に答える
1

あなたの正規表現は\W、単語の文字 (文字、数字、およびアンダースコア) ではないすべてのものと一致するほど単純になると思います。これはの否定です\w

したがって、コードは次のようになります。

foo.replaceAll("\W","");

コメントで指摘されているように、上記はピリオドも削除します。これはピリオドを保持するためにも機能します。

foo.replaceAll("[^\w.]","");

詳細: (文字クラス内の)、数字、アンダースコア、文字( )、またはピリオド( )以外のものをすべてエスケープします^\w\.

上記のように、ホワイトリストに追加したい他の文字があるかもしれません: のように-。あなたが進むにつれて、あなたのキャラクタークラスにそれらを含めるだけです.

foo.replaceAll("[^\w.\-]","");
于 2013-02-01T17:44:01.760 に答える