Подтвердить что ты не робот

Как совместить акцентированные символы с регулярным выражением?

Я запускаю Ruby on Rails 3.0.10 и Ruby 1.9.2. Я использую следующее Regex для соответствия именам:

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..

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

EDIT: чтобы ответить на ваш вопрос конкретно, лучшее решение, скорее всего, нормализует ваши строки в форме UDF8 NPD, а затем просто добавит 0x0300 и 0x0301 в список допустимых символов и любые другие сочетания символов, которые вы хотите разрешить (например, как точки в åäö, вы можете найти их все в "charmap" в Windows, посмотрите на 0x0300 и "вверх" ).