2014-02-14 3 views
0

Если у меня есть строка, как я могу проверить, содержит ли строка какую-либо последовательность «rldu»? Я действительно новичок в рубине, извините, если это глупый вопрос.Проверьте, содержит ли строка строку «udlr» в Ruby

r- правый, l-левый, d-down, u-up.

Например:

str = "udlv"  #should return false 
str = "lrd"  #should return true 
+4

Я в замешательстве. Что вы подразумеваете под «любой последовательностью« rldu »? Ваш пример, похоже, указывает, что вы хотите проверить, что строка состоит только из символов 'r',' l', 'd',' u' (в любом порядке) и ничего больше, это правильно? – Ajedi32

+2

Почему ваш второй пример не ожидал возвращения false? У него нет '' u''. – sawa

+3

Члены SO не возражают против простых вопросов, если это то, что вы подразумеваете под «глупым вопросом». То, что они имеют в виду, небрежно сформулированные вопросы. '... последовательность« ridu »' не имеет смысла. Будьте ясны, точны и полны! Измените свой вопрос, а не объясните в комментарии. –

ответ

2

Предполагая, что строка должна полностью состоять из указанных четырех символов в любом порядке

str =~ /^[rldu]+$/ 

будет возвращать целое число или ноль, что вы можете использовать в условном. Если вы хотите, логическое значение, использовать трюк с !!:

!!str.match(/^[rldu]+$/) 
+0

Nik и @ Ajedi32, извините, что испортил вам день, но Ruby [руководство по стилю] (https://github.com/bbatsov/ruby-style-guide) советует: «Избегайте использования !!». Вы хотите быть стильным, не так ли? –

+0

@CarySwoveland Какой? Например, в руководстве GitHub Ruby style не упоминается: https://github.com/styleguide/ruby. Если вы ссылаетесь на https://github.com/bbatsov/ruby-style-guide, приведенные примеры даже не показывают общего использования '!!' в коде Ruby, поэтому я бы с удовольствием проигнорировал этот совет. –

+0

ммм. он настолько лаконичен, что радует мой глаз :) Какая альтернатива! трюк?Тройной оператор вряд ли лучше, на мой взгляд, –

1

Предполагая, что «любой последовательности„rldu“» Значит, вы хотите, чтобы убедиться, что строка состоит из только r, l, d, u (любое количество раз, в любом порядке), и ничего другого, хороший старый регулярное выражение должно работать нормально:

str =~ /^[udlr]*$/ 

Если строго нужно, чтобы быть логическое значение (истина/ложь), то может префикс его двумя восклицательными знаками (double not), например:

!!(str =~ /^[udlr]*$/) 

В большинстве случаев вам не нужно это делать, поскольку Ruby может интерпретировать любое значение как истинное или ложное.

Вы можете просмотреть документацию всех основных методов Stringhere. И here - руководство по регулярным выражениям.

2

Если вы хотите, чтобы проверить, содержит ли строка ничего, кромеudlr, то

!("udlv" =~ /[^udlr]/) # => false 
!("lrd" =~ /[^udlr]/) # => true 
2

Это один не использует регулярное выражение:

p "udlv".count("^rlrd").zero? #=> false 
p "lrd".count("^rldu").zero? #=> true 

"^ rldu" означает " все остальное, чем rldu "

+0

Ваш код дает противоположность ожидаемому результату. И это сложно, потому что вы указали их в обратном порядке, как OP. Это можно исправить с помощью 'zero?'. – sawa

+0

@sawa спасибо. Это то, что у меня было, но я запутался, потому что у меня был порядок строк. – steenslag

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