2013-10-09 3 views
4

Я хочу вернуть true, если строка начинается с согласного. У меня есть два условия и я не знаю, как их объединить.Объединить два регулярных выражения

1) это письмо 2) не гласный

!!(s[0] =~ /([a-z]&&[^aeiou])/i) 

Я пробовал все виды другой синтаксис, как:

!!(s[0] =~ /([a-z])([^aeiou])/i) 
!!(s[0] =~ /(([a-z])([^aeiou]))/i) 

есть ли способ сделать это в одном регулярное выражение? Нужно ли проверять каждое условие отдельно?

+1

Что происходит со всеми этими «согласными» вопросами в последнее время? Например, «[using regexp для проверки, начинается ли строка с согласного] (http://stackoverflow.com/questions/18406509/using-regexp-to-check-whether-a-string-starts-with-a- consonant) " и" [if statement in ruby ​​with regex] (http://stackoverflow.com/questions/19214270/if-statement-in-ruby-using-regex) ". Есть много больше, если вы [поиск переполнения стека] (http://stackoverflow.com/search?q=%5Bruby%5D+consonant). –

ответ

8

Вы можете объединить классы символов с помощью оператора &&:

/[a-z&&[^aeiou]]/ 

Обратите внимание, что оператор && используется внутри класс символов, а не после него.

От documentation:

класс

Персонаж может содержать другой класс символов. Сам по себе этот не полезен, поскольку [a-z[0-9]] описывает тот же набор, что и [a-z0-9]. Однако классы символов также поддерживают оператор &&, который выполняет множество пересечений по своим аргументам. Два могут быть объединены следующим образом:

/[a-w&&[^c-g]z]/ # ([a-w] AND ([^c-g] OR z)) 
# This is equivalent to: 
/[abh-w]/ 
+0

Почему это не заканчивается утверждением, что оно эквивалентно '/ [abh-wz] /'? Что случилось с 'z'? Почему это было бы исключено, если бы оно не было частью класса с отрицанием ('[^ c-g]')? – iconoclast

+0

@iconoclast, потому что это множество пересечений между '[a-w]' и '[[^ c-g] z]'. Обратите внимание на круглые скобки в комментарии. – Stefan

3

Вы можете использовать внешний вид, чтобы проверить, что строка начинается с буквы и согласного.

\A(?=[^aeiou])(?=[a-z]) 

Или используйте отрицательный внешний вид.

(?i:(?![aeiou])[a-z]\w*) 
+0

Побей меня. Вам нужно будет следить за перспективами с чем-то, что действительно соответствует (например, '.' Или '\ w'), а затем оптимизация выглядит так, как будто это' && '. Кроме того, негативный внешний вид, такой как '(?! [Aeiou])' функционирует как «и-not». – iamnotmaynard

1
/^[bcdfghjklmnpqrstvwxyz]/i 

Не намного дольше, чем любитель вариантов.

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