如何只阅读英文字符

时间:2010-12-30 13:47:41

标签: ruby regex

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

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

它应该只是/^[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 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

人们可以为 eth ð þ做出争论,但它会弱得多可以为 wynn 做出的论证。

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

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

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

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

答案 2 :(得分:0)

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

詹姆斯·格雷写了一篇关于Encoding Conversion With iconv的好文章,这篇文章对于理解Iconv可以做什么以及处理UTF-8和Unicode字符非常有用。

相关问题