2014-02-19 3 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

примеры свидетельствуют о том, что не все буквы 'и', ' 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' имеет пробел, т. Е. Не разделяется на ',' –

Смежные вопросы