次のように、文字列からすべての特殊文字を削除する最良の方法は何ですか?
!@#$%^&*(){}|:"?><,./;'[]\=-
これらの文字が削除されたアイテムはかなり短いので、それぞれに REGEX を使用するか、単に文字列操作を使用する方がよいでしょうか?
どうも
環境 == C#/.NET
通常、ブラックリストよりもホワイトリストを作成する方が適切です。
正規表現には、事実上、英数字とアンダースコアを意味する便利\w
な機能があります (リストにアクセント付き文字 (á、é、ô など) を追加するバリアントもあれば、そうでないバリアントもあります)。
\W
英数字以外のすべてを意味するように使用することで、これを逆にすることができます。
したがって、空の文字列に置き換える\W
と、すべての「特殊」文字が削除されます。
または、英数字とは異なる文字セットが必要な場合は、否定文字クラスを使用できます。 は[^abc]
、またはa
以外のすべてに一致し、範囲外のすべてに一致します。b
c
[^a-z]
a,b,c,d...x,y,z
is と同等で\w
あり[A-Za-z0-9_]
、したがって\W
is[^A-Za-z0-9_]
PHPで:
$tests = array(
'hello, world!'
,'this is a test'
,'and so is this'
,'another test with /slashes/ & (parenthesis)'
,'l3375p34k stinks'
);
function strip_non_alphanumerics( $subject )
{
return preg_replace( '/[^a-z0-9]/i', '', $subject );
}
foreach( $tests as $test )
{
printf( "%s\n", strip_non_alphanumerics( $test ) );
}
出力は次のようになります。
helloworld
thisisatest
andsoisthis
anothertestwithslashesparenthesis
l3375p34kstinks
構文が読みやすく維持しやすいので、私は正規表現を好みます。
# in Python
import re
re.sub("[abcdef]", "", text)
abcdef
削除する適切にエスケープされた文字はどこにありますか。
あるいは、英数字 (およびアンダースコア) のみが必要な場合は、次を使用できます。
re.sub("\W", "", text)
ここで、単語以外の文字、つまり\W
を表します。[^a-zA-Z_0-9]
英数字のみが必要な場合は、反転文字クラスを使用してこれを表現できます。
[^A-Za-z0-9]+
これは、英数字以外のすべての文字を意味します。
ここに簡単な正規表現があります
[^\w]
これは、単語以外のすべての文字をキャッチする必要があります。これにより、az AZ 0-9 のスペースが許可され、スペースも _ もリストに含まれていないため、これらもキャッチしたい場合は、次のようにします。
/[a-z0-90/i
これは az と 0-9 の PHP 形式で、i は大文字と小文字を区別しません。
キー入力された文字の askey 値を取得することで、フロントエンドでそれらを検証できます。
PHPでの理想的なアプローチは...
$text = "ABCDEF...Á123";
$text = preg_replace( '/[^\p{L}]/i', '', $text);
print($text); # Output: ABCDEFÁ
または、Perlで...
my $text = "ABCDEF...Á123";
$text =~ s/[^\p{L}]//gi;
print($text); # Output: ABCDEFÁ
[^a-zA-Z] で単純に一致させると、アクセント付きの文字がすべて失われますが、(ほとんどの場合) 保持する必要があると思います。
どの言語で正規表現を使用していますか?
たとえば、Perl では、リスト内の文字を何も変換しない変換を行うことができます。
例: これは 'a'、'b'、'c' または 'd' を '' に変換します。
$sentence =~ tr/abcd//;
「tr」コマンドを使用しますか?
あなたがいる環境を言わないでください...シェル?Cプログラム?ジャワ?それらのそれぞれには、異なる最適なソリューションがあります。