2014-02-06 158 views
1

任务:标识符必须包含至少一个非数字且只包含数字,字母,“_”和“ - ”字符。因此'qwerty','identifier-45','u _-_-','-42-'是有效的标识符。检查字符串是否只包含允许的字符

而'123456','w & 1234','标识符42'是无效的。

我可以通过正则表达式来实现吗?

id.match(/\w\d/) 

或者与多于一个的匹配

id.match(/\w/) && id.match(/\d/) 

或者可以是我会使得所有允许的字符数组和过滤原始字符串除去它们(如果剩下的是超过[] ,有禁止的)?

id.to_a.select{|character| !((0..9) + (a..z) + ['-','_']).include?(character)}.count == 0 

即所有允许的字符被排除在串,并且如果其长度大于1,将有一些禁止字符(比如&

回答

3

使用正先行:

pattern = /^(?=.*\D)[-\w]+$/ 

pattern =~ 'qwerty' 
# => 0 
pattern =~ 'identifier-45' 
# => 0 
pattern =~ 'u_-_-' 
# => 0 
pattern =~ '-42-' 
# => 0 

pattern =~ '123456' 
# => nil 
pattern =~ 'w&1234' 
# => nil 
pattern =~ 'identifier 42' 
# => nil 
1

您可以使用lookahead来实现您的规则:

/^(?=.*\D)[\w-]*$/ 

这个正则表达式只会匹配至少有一个非数字字符串,只包含字母数字字符(尽管不会加重),_-

相关问题