只允许在Rails中的字符串中包含英文字符

时间:2017-06-09 22:12:59

标签: ruby-on-rails ruby string

我一直在使用它:

if value.chars.count < value.bytes.count
  puts "Some non english characters found."
end

但这错误地将以下内容标记为非英语。

React and You: A Designer’s Point of View

如何轻松检查字符串是否没有亚洲/法国/俄罗斯字符?

我可以遍历字符串中的每个字符,如果.bytes == 1将它添加到temp var中。然后,如果那个临时变量不是零,则表示它是英文字符。但这似乎相当复杂。

1 个答案:

答案 0 :(得分:1)

正如评论中指出的那样(herehere),此解决方案将拒绝一些英文单词,其中可能被视为“非英语“人物。

使用“How to read only English characters”中提供的答案,您可以调整它以删除任何标点字符或空格,并使用相同的正则表达式进行比较,如下所示:

str = "React and You: A Designer’s Point of View"
str.gsub(/[[:punct:]]|\s/, "") =~ /^[a-zA-Z]+$/
#=> 0

.gsub(/[[:punct:]]|\s/, "")会删除所有标点字符或空格,因此您可以将其与/^[a-zA-Z]+$/正则表达式进行比较。

以下是一步一步的例子:

str = "React and You: A Designer’s Point of View"
str.gsub!(/[[:punct:]]|\s/, "")         #=> "ReactandYouADesignersPointofView"
str =~ /^[a-zA-Z]+$/                    #=> 0

str = "Comment ça va?"
str.gsub!(/[[:punct:]]|\s/, "")         #=> "Commentçava"
str =~ /^[a-zA-Z]+$/                    #=> nil

如果您也期待数字,请将正则表达式更改为:/^[a-zA-Z0-9]+$/

正如this comment中所指出的,请注意,使用[[:punct:]]将允许非英语标点字符,例如¿¡;所以,如果这些字符也是预期的(并且必须导致拒绝该句子为有效),那么最好避免gsub并与具有所有允许字符的自定义正则表达式进行比较,例如 1 < / SUP>:

str =~ /^[a-zA-Z0-9\[\]{}\\*:;@$%&#?!|’'"-\.\/_\s]+$/

1 这只是我能想到的最常见字符的一个例子,但需要使用被视为有效的任何字符进行自定义。