2014-02-19 40 views
1

如何检查一个字符串是否仅包含逗号,逗号,数字和用字符串分隔的“urld”的任意组合?它应始终在以下表格:检查行是否包含Ruby中的特定字符

(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])+)/) 
+0

太近了!你只需要避开括号。 – Max

+0

我不认为你打算前两个例子是相同的。请在你的例子中加入'(0,3),u,r,u,lu'。我认为它是'假',因为在最后两个字符之间没有除['urld]之外的中间字符。 –

回答

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

+0

非常感谢!这对我有用,解释真的很有帮助! – user3187131

1

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

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 
+0

'“(0,3),u,r,u,l”.catch'ulrd'#=> false'。这不应该是真的吗? –

+0

@CarySwoveland我猜不应该,因为'd'不存在于字符串 –

+0

@CarySwoveland那个规则没有意义,那么如果'lu'有一个空格,也就是说没有被分割,' –

相关问题