如何只阅读英文字符

我正在阅读一个有时会有中文和英文以外语言字符的文件。

如何编写只读英文单词/字母的正则表达式?

应该只是/^[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 

你需要$ ,这意味着行尾:

 /^[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]表示任何非英语字符

想到的唯一真正的英文字母是wynnƿ

人们可以为ethð þ做出争论,但这可能是一个比wynn更弱的论点。

除此之外,英语通常使用拉丁字母,尽管有一些修改。 Wynn可能除外,没有英文字母,只有拉丁字母。

当然存在正则表达式,要求基本字符在拉丁语或公共脚本中,例如

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

但是,由于您没有指定是使用7位还是8位版本的Ruby还是21位版本,我不知道该告诉您什么。

有时使用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”选项会降低字符串的质量,但出于我们的目的,它可以。

James Gray写了一篇关于使用iconv转换编码的好文章,这对于理解Iconv可以做什么以及处理UTF-8和Unicode字符非常有用。