我正在阅读一个有时会有中文和英文以外语言字符的文件。
如何编写只读英文单词/字母的正则表达式?
它应该只是/^[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
答案 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字符非常有用。