web-dev-qa-db-ja.com

アクセント付き文字を正規表現と一致させる方法は?

Ruby on Rails 3.0.10 and Ruby 1.9.2。私は次の正規表現を順番に使用しています名前を一致させるには:

NAME_REGEX = /^[\w\s'"\-_&@!?()\[\]-]*$/u

validates :name,
  :presence   => true,
  :format     => {
    :with     => NAME_REGEX,
    :message  => "format is invalid"
  }

ただし、次のような単語を保存しようとすると、

Oilalà
Pì
Rùby
...

# In few words, those with accented characters

検証エラー"Name format is invalid.があります。

上記の正規表現を変更して、àèéìòù、...?

32
user502052

\wの代わりに、 POSIXブラケット式[:alpha:]を使用します。

"blåbær dèjá vu".scan /[[:alpha:]]+/  # => ["blåbær", "dèjá", "vu"]

"blåbær dèjá vu".scan /\w+/  # => ["bl", "b", "r", "d", "j", "vu"]

特定のケースでは、正規表現を次のように変更します。

NAME_REGEX = /^[[:alpha:]\s'"\-_&@!?()\[\]-]*$/u

ただし、これはアクセント付き文字だけではありません。それは良いことです。ソフトウェアアプリケーションの名前に関する一般的な誤解について このブログエントリ を必ずお読みください。

57
Lars Haugseth

もちろん、1つの解決策は、通常のようにそれらを使用するだけですべてを見つけることですが、かなり多くなる可能性があると思います。

UTF8を使用している場合、そのような文字はしばしば「基本」文字自体の2つの部分に分割され、その後に結合文字とも呼ばれるアクセント(0x0300および0x0301)が続きます。ただし、一部の文字は「ハードコードされた」文字コードを使用して書き込むこともできるため、これは常に当てはまるとは限りません。まず、UTF8文字列をNFD形式に正規化する必要があります。

もちろん、任意の文字列をUTF8に変換してから元の文字セットに戻すこともできますが、一括操作を実行している場合、オーバーヘッドが非常に大きくなる可能性があります。

編集:質問に具体的に答えるために、最善の解決策は、文字列をUTF8 NPD形式に正規化してから、受け入れ可能な文字のリストに0x0300と0x0301を追加し、許可するその他の結合文字(ドットなど)を追加することです。 åäöでは、Windowsの「charmap」ですべて見つけることができます。0x0300と「up」を参照してください)。

0
Andreas