2009-08-08 4 views
11

印刷可能なすべての文字を表す\ wのような特別な正規表現はありますか?文字列には印刷できる文字のみが含まれていることを検証したいと思います。 \ b(bell)やnullなどのASCII制御文字は含まれていません。キーボード上のものはすべて問題ありません。UTF文字も同様です。すべてのPRINTABLE文字の正規表現

特殊な文がない場合、これを正規表現でどのように指定できますか?

+3

純粋なASCII文字を探していた場合、スペースからチルダまでのすべてのASCIIにマッチする '[ - 〜] +' 。 – saluce

答えて

7

制御可能文字に一致するPOSIX文字クラス指定[:print:]と、制御文字には[:cntrl:]があります。これらの一致コードはASCIIテーブル全体で一致するため、他のエンコードとのマッチングには適していない可能性があります。

この場合、式[\x00-\x1f]はASCIIの制御文字と一致しますが、これらは他のエンコーディングでも印刷可能です。

1

これは、使用している正規表現パッケージによって大きく異なります。これは、スタンダードについてのすばらしいことは、選択すべきものがたくさんあると言う馬鹿がいるという状況の1つです。

Cを使用している場合、isprint(3)関数/マクロはあなたの友人です。

13

あなたの正規表現の風味がUnicode propertiesをサポートしている場合、これはおそらく最良の方法がベストです:

\P{Cc} 

それはASCII可能かどうか、制御文字ではありません任意の文字に一致 - [\x00-\x1F\x7F] - またはLatin1の - [\x80-\x9F](C1制御文字とも呼ばれます)。

[:print:]\p{Print}のようなPOSIXクラスの問題点は、正規表現の味や場合によっては基盤となるプラットフォームのロケール設定に応じて異なるものと一致することができるということです。 Javaでは、それらは厳密にASCII指向です。これは、ASCII印刷文字-[\x20-\x7E] - \P{Cntrl}(大文字の 'P'に注意してください)がではなく、のASCII制御文字-と一致する間に、\p{Print}がASCII印刷文字と一致することを意味します。つまり、制御文字でないASCII文字(または)と、非ASCII文字(C1制御文字を含む)とが一致します。

8

パーティーには非常に遅れていますが、この正規表現は動作します:/[ -~]/

どのようにですか? スペース(ASCII DEC 32)〜チルド(ASCII DEC 126)の範囲のすべての文字に一致します。これは印刷可能なすべての文字の範囲です。

あなたは非ASCII文字を削除したい場合は、あなたのようなもの使用することができます

$someString.replace(/[^ -~]/g, ''); 

注:これは有効な.netコードではありませんが、検索経由して、この時につまずく人のための正規表現の使用の例後でエンジン。

0

@アランムーアに加えて、\P{Cc}は、実際にはNegative Unicode Category or Unicode Block(参考:Character Classes in Regular Expressions)の例です。 \P{name}は、がUnicode一般カテゴリまたは名前付きブロックに属していない文字と一致します。 .Netでサポートされている名前付きブロックの他の例については、参照先のリンクを参照してください。