如何检查字符串是否包含带重音的拉丁字符,例如 Ruby 中的 é?

How to check if a string contains accented Latin characters like é in Ruby?

鉴于:

str1 = "é"   # Latin accent
str2 = "囧"  # Chinese character
str3 = "ジ"  # Japanese character
str4 = "e"   # English character

如何区分 str1(拉丁重音字符)与其余字符串?

更新:

给出

str1 = "\xE9" # Latin accent é actually stored as \xE9 reading from a file

答案会有什么不同?

尝试使用 /\p{Latin}/.match(strX)/\p{Latin}&&[^a-zA-Z]/(如果您只想检测特殊的拉丁字符)。

顺便说一下,"e" (str4) 也是一个拉丁字符。

希望对您有所帮助。

我会使用两阶段方法:

  1. 通过尝试将字符串编码为 Latin-1 (ISO-8859-1) 来排除包含非拉丁字符的字符串。
  2. 使用正则表达式测试重音字符。

示例:

def is_accented_latin?(test_string)
  test_string.encode("ISO-8859-1")   # just to see if it raises an exception

  test_string.match(/[ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöùúûüýþÿ]/)
rescue Encoding::UndefinedConversionError
  false
end

我强烈建议您 select 自己尝试筛选重音字符,而不是仅仅复制我写的内容;我当然可能错过了一些。另请注意,对于包含非拉丁字符的字符串,这将始终 return false,即使该字符串还包含带有重音符号的拉丁字符。

我会先用 gsub 去掉所有纯 ASCII 字符,然后用正则表达式检查是否还有任何拉丁字符。这应该检测带重音的拉丁字符。

def latin_accented?(str)
  str.gsub(/\p{Ascii}/, "") =~ /\p{Latin}/
end

latin_accented?("é")  #=> 0 (truthy)
latin_accented?("囧") #=> nil (falsy)
latin_accented?("ジ") #=> nil (falsy)
latin_accented?("e")  #=> nil (falsy)