Как сопоставить акцентированные символы с регулярным выражением? - PullRequest
32 голосов
/ 03 сентября 2011

Я использую Ruby on Rails 3.0.10 и 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..

Как изменить вышеприведенное регулярное выражение, чтобы оно соответствовало символам с акцентом, таким как à, è, é, ì, ò, ù, ...?

Ответы [ 2 ]

57 голосов
/ 03 сентября 2011

Вместо \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

Это соответствует гораздо большему, чем просто акцентированные символы. Который является хорошая вещь. Обязательно прочитайте эту запись в блоге о распространенных заблуждениях относительно имен в программных приложениях.

0 голосов
/ 03 сентября 2011

Одно из решений, конечно, состоит в том, чтобы просто найти их всех, просто использовать их как обычно, хотя я предполагаю, что их может быть довольно много.

Если вы используете UTF8, то вы обнаружите, что такие символы часто делятся на две части, сам «базовый» символ, за которым следует акцент (я думаю, 0x0300 и 0x0301), также называемый символом комбинирования. Однако это не всегда может быть правдой, поскольку некоторые символы также могут быть записаны с использованием «жестко закодированного» кода символа ... поэтому сначала вам нужно нормализовать строку UTF8 в форме NFD.

Конечно, вы можете также превратить любую имеющуюся строку в UTF8, а затем обратно в исходную кодировку ... но издержки могут стать довольно большими, если вы выполняете массовые операции.

РЕДАКТИРОВАТЬ: Чтобы конкретно ответить на ваш вопрос, лучшее решение, скорее всего, нормализует ваши строки в форме NPT UTF8, а затем просто добавляет 0x0300 и 0x0301 в список допустимых символов и любые другие комбинируемые символы, которые вы хотите разрешить (например, в качестве точек в строке вы можете найти их все в "charmap" в Windows, посмотрите на 0x0300 и "вверх").

...