我需要检测一些字符串是否包含非拉丁字母表的符号。数字和特殊符号如-
,_
,+
都是可以接受的。我需要知道是否有任何非拉丁符号。例如:
"123sdjjsf-4KSD".just_latin?
应该返回true
。
"12333ыц4--sdf".just_latin?
应该返回false
。
# 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?
[\p{L}&&[^a-zA-Z]]
&&
语法是用来交集两个字符类的。第一个字符类 (\p{L}
) 匹配任何 Unicode 字母。第二个字符类 ^a-zA-Z
匹配任何不是 (^
) 拉丁字母 (a-z
或 A-Z
) 的字符。也就是说,整个字符类匹配任何非拉丁字母的字母。
所以如果你在 just_latin?
中使用这个正则表达式,并且如果没有找到匹配项就返回 true
,那么它应该像你想要的那样工作。
我之前尝试过使用 Unicode 属性 \p{Latin}
作为第二个字符类,但这并不完全可靠,因为 \p{Latin}
包括例如冰岛字符 þ
、æ
、ð
在内。
好了,只需匹配这些字符,你就完成了(a-z
表示从 a
到 z
的字符):^[a-zA-Z_\-+]+$
12333
,一次在4--sdf
。这就是为什么您需要锚点来防止匹配。关于其他字符。他说“特殊符号如...”,但我想这是有争议的。当然,如果OP有一个他想允许的特定字符列表,那么您的模式(带锚点)就是正确的方法。 - Martin Ender