如何使用Ruby 1.9检测字符串是否仅包含拉丁字母符号?

10

我需要检测一些字符串是否包含非拉丁字母表的符号。数字和特殊符号如-_+都是可以接受的。我需要知道是否有任何非拉丁符号。例如:

"123sdjjsf-4KSD".just_latin?

应该返回true

"12333ыц4--sdf".just_latin?

应该返回false


3
像 éöã&$ 这样的字符怎么处理? - steenslag
你说的 Latin 到底是什么意思? - matt
3个回答

7
我认为这对你应该有效:
 # encoding: UTF-8

 class String
   def just_latin?
     !!self.match(/^[a-zA-Z0-9_\-+ ]*$/)
   end
 end

 puts "123sdjjsf-4KSD".just_latin?
 puts "12333ыц4--sdf".just_latin?

请注意,*#ascii_only?*也非常接近您想要的内容。

5
以下正则表达式将匹配一个非拉丁字母的单个字母字符:
[\p{L}&&[^a-zA-Z]]
&& 语法是用来交集两个字符类的。第一个字符类 (\p{L}) 匹配任何 Unicode 字母。第二个字符类 ^a-zA-Z 匹配任何不是 (^) 拉丁字母 (a-zA-Z) 的字符。也就是说,整个字符类匹配任何非拉丁字母的字母。

在 Rubular 上查看它的工作原理。

所以如果你在 just_latin? 中使用这个正则表达式,并且如果没有找到匹配项就返回 true,那么它应该像你想要的那样工作。

我之前尝试过使用 Unicode 属性 \p{Latin} 作为第二个字符类,但这并不完全可靠,因为 \p{Latin} 包括例如冰岛字符 þæð 在内。


1

好了,只需匹配这些字符,你就完成了(a-z 表示从 az 的字符):^[a-zA-Z_\-+]+$


他说那些字母加上那些符号。至于锚点,如果他需要在整个字符串上使用,我认为它们是不必要的。 - Javier Diaz
第二个输入字符串将与您的模式匹配。一次在12333,一次在4--sdf。这就是为什么您需要锚点来防止匹配。关于其他字符。他说“特殊符号如...”,但我想这是有争议的。当然,如果OP有一个他想允许的特定字符列表,那么您的模式(带锚点)就是正确的方法。 - Martin Ender

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接