2010-08-26 3 views
9

Я использую Ruby 1.9 и пытаюсь выяснить, какой REGEX мне нужно сделать это верно:Как совместить слова юникода с ruby ​​1.9?

Encoding.default_internal = Encoding.default_external = 'utf-8' 
"föö".match(/(\w+)/u)[1] == "föö" 
# => false 
+0

Вы должны преобразовать обе строки в один и тот же юникод, чем вы можете ее сопоставить. С Iconv вы можете преобразовать строку в определенный unicode. –

+0

Добавлена ​​кодировка по умолчанию. Все еще не работает ... – Reactormonk

+0

Попробуйте разместить комментарий «# coding utf-8» в начале скрипта и убедитесь, что этот файл сценария - utf-8. – Nakilon

ответ

36
# encoding=utf-8 
p "föö".match(/\p{Word}+/)[0] == "föö" 
+2

О, я люблю тебя! – Hock

+1

Сумасшедший, что вам нужно пометить исходный код как UTF8, чтобы заставить регулярное выражение корректно вести себя с правильной кодировкой. Большое спасибо ! – demental

+2

Хорошую документацию для этого можно найти здесь: http://www.ruby-doc.org/core-1.9.3/Regexp.html#label-Character+Properties –

0

Вы можете manually turn on Unicode matching используя внутренний (?u) синтаксис:

"föö".match(/(?u)(\w+)/)[1] == "föö" 
# => true 

Однако, используя Unicode Синтаксис свойств (ответ steenslag) или POSIX Brackets Синтаксис - это лучший стиль, поскольку оба они автоматически учитывают коды Unicode:

"föö".match(/(\p{word}+)/)[1] == "föö" 
# => true 

"föö".match(/([[:word:]]+)/)[1] == "föö" 
# => true 

См. this blog post для получения дополнительной информации о соответствии символов Юникода в регулярных выражениях Ruby.