如何检查字符串是否包含带重音的拉丁字符,例如 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) 也是一个拉丁字符。
希望对您有所帮助。
我会使用两阶段方法:
- 通过尝试将字符串编码为 Latin-1 (ISO-8859-1) 来排除包含非拉丁字符的字符串。
- 使用正则表达式测试重音字符。
示例:
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)
鉴于:
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) 也是一个拉丁字符。
希望对您有所帮助。
我会使用两阶段方法:
- 通过尝试将字符串编码为 Latin-1 (ISO-8859-1) 来排除包含非拉丁字符的字符串。
- 使用正则表达式测试重音字符。
示例:
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)