Как читать только английские символы - PullRequest
2 голосов
/ 30 декабря 2010

Я читаю файл, который иногда содержит китайский язык и символы других языков, кроме английского.

Как мне написать регулярное выражение, которое читает только английские слова / буквы?

Должно ли это быть /^[a-zA-Z]+/?

Если я сделаю вышеизложенное, то такие слова, как "eété", все равно будут выбраны, но я не хочу этого:

"été".match(/^[a-zA-Z]+/) => #nil  good I didn't want that word

"eété".match(/^[a-zA-Z]+/) => #not nil  tricked into picking something I did not want

Ответы [ 3 ]

3 голосов
/ 31 декабря 2010

Единственное по-настоящему английское письмо, которое приходит на ум, это wynn ƿ .

Можно привести аргумент для eth ð и thorn þ , но это будет гораздо более слабый аргументчем это может быть сделано для wynn .

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

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

(?:[\p{Script=Latin}\p{Script=Common}]\pM*+)+

, но так как вы не указали, используете ли вы 7- или 8-битную версию Ruby или 21-битную версию, я не уверен, что вам сказать.

3 голосов
/ 30 декабря 2010

Вам нужно $, что означает конец строки:

/^[a-zA-Z]+$/

Или, если вы используете такую ​​фильтрацию:

strings.select { |s| /^[a-zA-Z]+$/ =~ s }
# which is equal to strings.grep /^[a-zA-Z]+$/

, вы можете использовать метод отрицательной фильтрации с немного более простым регулярным выражением:

strings.reject { |s| /[^a-zA-Z]/ =~ s }

, где [^a-zA-Z] означает любой неанглийский символ .

0 голосов
/ 02 января 2011

Иногда полезно использовать библиотеку Iconv для работы с не-ASCII:

require 'iconv'

utf8_to_latin1 = Iconv.new("LATIN1//TRANSLIT//IGNORE", "UTF8") # !> encoding option isn't portable: TRANSLIT//IGNORE
utf8_to_ascii_translit = Iconv.new("ASCII//TRANSLIT", "UTF8") # !> encoding option isn't portable: TRANSLIT
utf8_to_ascii_ignore = Iconv.new("ASCII//IGNORE", "UTF8") # !> encoding option isn't portable: IGNORE

resume = "Résumé"
utf8_to_latin1.iconv(resume) # => "R\xE9sum\xE9"
utf8_to_ascii_translit.iconv(resume) # => "R'esum'e"
utf8_to_ascii_ignore.iconv(resume) # => "Rsum"

Обратите внимание, что Ruby предупреждает, что варианты выбора не переносимы.Это означает, что может быть некоторое повреждение обрабатываемой строки;Опции «// TRANSLIT» и «// IGNORE» могут ухудшать качество строки, но для нашей цели все в порядке.

Джеймс Грей написал хорошую статью о Преобразовании кодирования с iconv , котороеполезно для понимания того, что может сделать Iconv, а также для работы с символами UTF-8 и Unicode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...