2009-03-17 8 views
10

普通の正規表現では"[a-zA-Z]"ですが、私はスウェーデン出身ですので、"[a- zåäöA-ZÅÄÖ] "。しかし、どの文字がアルファベットで使われているのかわからないとします。azより先に文字をキャッチする正規表現

特定のロケール/言語でどのような文字が有効であるかを自動的に知る方法はありますか?または、私が望んでいないことを知っていると思う文字のブラックリストを作成するだけですか?

答えて

13

\ pLを使用すると、すべての文字をすべての言語でサポートする任意の「文字」に一致させることができます。 「名前付きブロック」を使用して特定の言語に絞り込むことができます。詳細については、MSDNのCharacter Classesのドキュメントを参照してください。

正規表現(または少なくとも「文字」部分)をローカライズされたリソースに入れることをお勧めします。ローカライズされたリソースは、現在のロケールに基づいて引き出して、より大きなパターンにすることができます。

+4

私のような正規表現ではない人のために、実際の正しいコードは:\ p {Ll} –

+0

です。文字にマッチさせるには '\ p {L}'を使います。発音記号と一致させるには '(?> \ p {L} \ p {M} *)'を使います。大文字をマッチさせるには '\ p {Lu}'を使います。小文字にマッチする - yes - '\ p {Ll}'を使います。 –

0

すべての文字は「有効」なので、ロケールで「一般的に文字と見なされる」文字を実際に求めていると思います。

Unicode仕様にはいくつかのガイドラインがありますが、一般的に答えは「いいえ」であるため、「文字」であると判断する文字をリストする必要があります。

+0

私が提案[:アルファ:]私は削除した答えに。私はC#を知らないので、おそらく間違っていますが、私がよく知っている正規表現エンジンはロケールに基づいて一致する文字を変更します。 –

+0

@Jon:.netは名前付きクラスの[:name:]をサポートしていませんが、同じ目的の別の構文を持っています。 – Richard

+0

@ Jason:文字の定義がUnicdeと異なる場合にのみリストする必要があり、Character Class Subtractionは不十分です。 [\ p {L} - [\ p {IsBasicLatin}]]はすべての非ASCII文字と一致します。 – Richard

3

\ p {名前}はどうですか?

{name}で指定された名前付き文字クラスの任意の文字と一致します。 サポートされている名前は、Unicodeグループとブロック範囲です。たとえば、L1、Nd、Z、 IsGreek、IsBoxDrawingなどです。

私はユニコードについて十分に分かりませんが、あなたのキャラクターはユニコードクラスに合っていますか?

0

自動的に私はしたくない知っている文字があり、指定されたロケール/言語で有効であるか、私はちょうど私が(Iと思う)文字のブラックリストを作るべきかを知る方法はありますか?

これは、一般にではありません。

すべての英文テキストにはアクセント付きの文字が含まれています(例:「fête」と「naïve」 - 英国では厳密に正しいアクセント記号を使用してください)。いくつかの言語では、いくつかの標準文字はほとんど使用されない(例えばフランス語のy-分詞)。

外国語を含めることを検討してください(技術用語が使用されることが多い)。引用が別の情報源になります。

要件が十分に細かく定義されていると、定義を作成できますが、その言語での言語経験が必要です。

0

この正規表現は、唯一の有効なシンボルを通じことができます:

[a-zA-ZÀ-ÿ ] 
関連する問題