2014-02-06 186 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-]*$/ 

這個正則表達式只會匹配至少有一個非數字字符串,只包含字母數字字符(儘管不會加重),_-

相關問題