2016-06-22 4 views
1

Когда я тренировался в rubular.com, я пытаюсь совместить с регулярным выражением, которое проверяет, начинается ли слово с неконсонансного. Мой подход это проверка случаев, как это начинается с не-буквой, или начинается с цифры или подчеркивания или проверяет пустую строку Я основал странное поведение:Странная вещь в регулярном выражении

Мой регулярное выражение /^[aeiou_0-9\W]|^$/i Сопрягайте k и s согласные! , Я не понимаю, почему.

Любые идеи?

Ссылка на пример ->http://rubular.com/r/0zt0VPmcwr

+0

Это соответствует \ W. Однако я не знаю, почему. – Albin

+0

Кроме того, он подходит только при использовании с i-Modifier и внутри символьного стекла. –

+3

Это ошибка в регулярном выражении Ruby. См. ['[\ W]'] (https://ideone.com/mIi82W), он соответствует 'k' /' K' и 's' /' S' (да, только с '/ i'). –

ответ

3

Это очень смешно, потому что вы натолкнулись на ошибку специально для букв k и s при использовании \ W с/i (это как идеальный шторм).

Вот ссылка, которая объясняет ошибку: https://bugs.ruby-lang.org/issues/4044

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

/^[^bcdfghjklmnpqrstvwxyz]|^$/i 

Вот является Rubular ссылка: http://rubular.com/r/URgsWP3suQ

Edit: Так, что-то еще я заметил что ваше регулярное выражение (и регулярное выражение, приведенное выше) соответствует только первой букве слов, где в качестве регулярного выражения, которое я предоставил, соответствует всему слову. Я не знаю, имеет ли это значение для вас, но я чувствовал, что стоит отметить. Пожалуйста, увидеть разницу в подсветке в Rubular ссылке выше и один ниже (Посмотрите, как ссылка выше, только подчеркивает первую букву слова, где, как ссылка ниже выдвигает на первый план целые слова):

^[^bcdfghjklmnpqrstvwxyz].*|^$ 

http://rubular.com/r/IVJ03uOK4h

+1

'(('a' .. 'z'). To_a -% w (a e o u i)). Join' выглядит более выразительным и подверженным ошибкам. – mudasobwa

+0

Вы правы. @mudasobwa – Sophtware

3

Это ошибка в Ruby, регулярное выражение в некоторых версиях. Выберите вариант 1.8.7 в раскрывающемся списке, и вы увидите, что ваше регулярное выражение работает правильно.

Редактировать. Проверьте документы на http://ruby-doc.org/core-2.1.5/Regexp.html. Более конкретно, в разделе метасимволов:

  • /\ W/- Символ без слова ([^ a-zA-Z0-9_]). Пожалуйста, взгляните на Bug #4044 при использовании/\ W/с модификатором/i.
+0

Это отнюдь не ответ, он должен быть опубликован как комментарий. – mudasobwa

+0

Извините, я только что начал публикацию в формате SO, и мне нужно 50 представителей, чтобы прокомментировать вопрос. – fjsuarez

+0

Тогда вы могли бы попытаться разработать, например. г. найти ссылки на доказательство, показать альтернативные примеры для разных версий и т. д. Тот факт, что это «ошибка в какой-то рубиновой версии», является очевидным как для OP, так и для всех читателей. – mudasobwa