【问题标题】:How to read only English characters如何只阅读英文字符
【发布时间】:2017-06-10 07:34:05
【问题描述】:

我正在阅读的文件有时包含中文和英文以外的其他语言字符。

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

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

【问题讨论】:

  • 与流行观点相反,并非所有英语单词都能不受干扰地适应 ASCII。法语词源通常是这种情况(例如,naïve)。
  • 真的。是的,它是法语。但是如果我可以将上面的正则表达式应用于单词中的每个字符,那么它可能会起作用..
  • 你如何建议拒绝像eété这样的词,同时仍然捕获像café这样的词?
  • 并非英语以外的所有语言都有[a-zA-Z] 之外的字符。因为 Unicode 联盟拒绝了克林贡文字,所以除非您使用 Unicode 的私人用户区,否则克林贡语言以拉丁字母表示。但是您不必在第一次迭代中处理这个问题。

标签: ruby regex


【解决方案1】:

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

人们可以为 eth ðthorn þ 提出一个论据,但它会弱得多wynn.

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

确实存在要求基本字符采用拉丁文或通用脚本的正则表达式,例如

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

但由于您没有具体说明您使用的是 7 位还是 8 位版本的 Ruby 还是 21 位版本,所以我不知道该告诉您什么。

【讨论】:

  • “拉丁语”一词是否具有误导性,因为古罗马人不使用“j”?
  • @Andrew:古老的拉丁字母甚至没有 G 或 Z。现在桥下都是水。我真正的观点是关于如何谈论具有 Unicode 属性 \p{Script=Latin} 的字符,但对于 \p{Script=English} 却不能这样做。
【解决方案2】:

你需要$,表示行尾:

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

【讨论】:

  • [^a-zA-Z]当然不代表 任何非英文字符!这意味着一个字符不在列出的范围内。你必须像我那样描述它,而不是像你那样,否则你会招致许多假阴性和许多假阳性。您的描述无效,即使代码可能具有某种预期效果(尽管我对此表示怀疑)。如果您只想要 6 位 Radix-50 字符,那很好,但我们不是即将开始第三个千年的第二个十年吗?似乎这种地方主义对任何人都没有帮助。
【解决方案3】:

有时使用 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 写了一篇关于 Encoding Conversion With iconv 的好文章,有助于理解 Iconv 可以做什么,以及处理 UTF-8 和 Unicode 字符。

【讨论】:

    猜你喜欢
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多