Как совместить акцентированные символы с регулярным выражением?
Я запускаю 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 так, чтобы он соответствовал также акцентированным символам, таким как à
, è
, é
, ì
, ò
, ù
,...?
Ответы
Ответ 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 и "вверх" ).