检查行中是否包含Ruby中的特定字符

时间:2014-02-19 16:47:19

标签: ruby regex string

如何检查字符串是否仅包含paranthesis,逗号,数字以及用字符串分隔的“urld”的任意组合?它应该始终采用以下形式:

(0,3),u,r,u,l,u #True

(0,3),u,r,u,l,u #True

(0,3),u,r,u,l u #False because of space b/w l and u

我试过这样的事情,但好像我没事了:

if !misc_text.match(/^(\d+,\d+\)(,[udlr])+)/)

3 个答案:

答案 0 :(得分:1)

也许你需要这个正则表达式:/^(\(\d+,\d+\)(,[udlr])+)$/

答案 1 :(得分:1)

这些例子表明并非所有的字母都是'u','r','l','d'。我假设字符串可以包含这四个字母中的每一个的任意数量(除了其他允许的字符)。我还假设'urld'与字符串分隔的任意组合'意味着这四个字符的每一对必须由一个或多个其他允许的字符分隔。这是实现这一目标的一种方法:

def check_it(s)
  (s.chars.chunk {|c| c =~ /[urld]/}.to_a.size == s.count('urld') &&
    s =~ /^[(),\durld]*$/) ? true : false
end

check_it('(0,3),u,r,u,l,u') #=> true
check_it('(0,3),u,r,u,l u') #=> false
check_it('(0,3),u,r,u,lu')  #=> false

假设

s = '(0,3),u,r,u,lu'

然后

a = s.chars.chunk {|c| c =~ /[urld]/}.to_a
  #=> [[0, ["u"]], [0, ["r"]], [0, ["u"]], [0, ["l", "u"]]]

a.size #=> 4

s.count('urld') #=> 5

a.size < s.count('urld')时,count_it()会返回false

如果相反:

s = '(0,3),u,r,u,l u'

然后

s.chars.chunk {|c| c =~ /[urld]/}.to_a.size
  #=> a = [[0, ["u"]], [0, ["r"]], [0, ["u"]], [0, ["l"]], [0, ["u"]]]
  #   a.size => 5
  #   5 == s.count('urld') => true 

s =~ /^[(),\durld]*$/ #=> nil

所以check_it() => false

答案 2 :(得分:0)

您可以执行以下操作,混合操作:

class String
   def catch str
      str.split('').all? {|l| /,#{l}(,|\b)/ =~ self }
   end
end

这样:

"(0,3),u,r,u,l,d".catch('ulrd') # => true

"(0,3),u,r,u,l d".catch('ulrd') # => false