web-dev-qa-db-ja.com

文字列からすべての特殊文字を削除する正規表現?

私は完全に正規表現ができないので、正規表現を使用することで解決するのが最善だと思う問題についての助けが必要です。

私はC#の文字列のリストを持っています:

List<string> lstNames = new List<string>();
lstNames.add("TRA-94:23");
lstNames.add("TRA-42:101");
lstNames.add("TRA-109:AD");

foreach (string n in lstNames) {
  // logic goes here that somehow uses regex to remove all special characters
  string regExp = "NO_IDEA";
  string tmp = Regex.Replace(n, regExp, "");
}

リストをループして、特殊文字なしで各項目を返すことができる必要があります。たとえば、アイテム1は「TRA9423」、アイテム2は「TRA42101」、アイテム3はTRA109ADになります。

これを実現できる正規表現はありますか?

また、リストには4000を超えるアイテムが含まれているため、可能であれば検索と置換を効率的かつ迅速に行う必要があります。

編集:私は、a-z、A-Z、0-9以外の文字は私の状況では特別であることを指定する必要がありました。

61
Jagd

本当に特殊文字の定義に依存します。ほとんどの場合、ブラックリストではなくホワイトリストが最善のアプローチであることがわかります。

tmp = Regex.Replace(n, "[^0-9a-zA-Z]+", "");

次の2つの項目は同じ文字列に変換され、区別できないため、現在のアプローチには注意が必要です。

"TRA-12:123"
"TRA-121:23"
104
Mark Byers

これはそれを行う必要があります:

[^a-zA-Z0-9]

基本的に、すべての非英数字に一致します。

16
Daniel Egeberg

[^a-zA-Z0-9]は、英数字以外の任意の文字に一致する文字クラスです。

あるいは、[^\w\d]は同じことをします。

使用法:

string regExp = "[^\w\d]";
string tmp = Regex.Replace(n, regExp, "");
16
MikeD

次を使用できます。

string regExp = "\\W";

これは、ダニエルの「[^a-zA-Z0-9]」と同等です

\ Wは、単語以外の文字と一致します。 Unicodeカテゴリ[^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]と同等。

8
Dan Diplo

「特殊文字」の定義にもよりますが、おそらく「[^ a-zA-Z0-9]」でうまくいくと思います。それは、小文字、大文字、または数字以外のものを見つけます。

3
Jay
tmp = Regex.Replace(n, @"\W+", "");

\wは文字、数字、アンダースコアに一致し、\Wは否定バージョンです。

2
Paul Creasey

私の目的では、すべての英語のASCII文字が必要だったので、これは機能しました。

html = Regex.Replace(html, "[^\x00-\x80]+", "")
2
BobC

正規表現を使用したくない場合は、別のオプションを使用します

char.IsLetterOrDigit

これを使用して、文字列の各文字をループし、trueの場合にのみ返すことができます。

0
Demarily
public static string Letters(this string input)
{
    return string.Concat(input.Where(x => char.IsLetter(x) && !char.IsSymbol(x) && !char.IsWhiteSpace(x)));
}
0
user1883961