2010-05-07 2 views
0

У меня есть строка, как «{некоторые | слова | которые | здесь}» или «{другие | набор | из | слов}»рубин параметризованного регулярного выражения

Так что в целом строка состоит из открывающей фигурной скобки , слова, ограниченные трубой и закрывающей фигурной скобкой.

Каков наиболее эффективный способ получить выбранное слово этой строки?

Я хотел бы сделать что-то вроде этого:

@my_string = "{this|is|a|test|case}" 
@my_string.get_column(0) # => "this" 
@my_string.get_column(2) # => "is" 
@my_string.get_column(4) # => "case" 

Что следует метод get_column содержать?

+2

ленты брекеты, разделить на трубу. И вы, вероятно, имеете в виду 'get_column (2)' => '' a'' – SilentGhost

ответ

2

Так что это решение прямо сейчас мне нравится:

class String 
    def get_column(n) 
    self =~ /\A\{(?:\w*\|){#{n}}(\w*)(?:\|\w*)*\}\Z/ && $1 
    end 
end 

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

Объяснение регулярное выражение:

  • \A является beginnning строки и \Z конец, так что это регулярное выражение соответствует enitre строку.
  • Поскольку фигурные скобки имеют особое значение, мы избегаем их как \{ и \}, чтобы соответствовать фигурным скобкам в начале и конце строки.
  • следующее, мы хотим пропустить первые n столбцов - мы не заботимся о них.
    • Предыдущий столбец некоторое количество букв и вертикальной чертой, таким образом, мы используем стандартные \w, чтобы соответствовать слово, как символ (включая цифры и подчеркивания, но почему нет) и *, чтобы соответствовать любое их количество , Вертикальный бар имеет особое значение, поэтому нам нужно избегать его как \|. Поскольку мы хотим сгруппировать это, мы прилагаем его все внутри не захватывающих парнеров (?:\w*\|) (?: делает его не захватывающим).
    • Теперь у нас есть n предыдущих столбцов, поэтому мы говорим регулярному выражению, чтобы он соответствовал шаблону столбца n раз с использованием регулярного выражения count - просто поместите число в фигурные скобки после шаблона. Мы используем стандартную строку substition, поэтому мы просто положить в {#{n}} означает «соответствовать предыдущему шаблону точно n раз.
  • первым не пропустил колонну после того, что это один мы заботимся о том, чтобы мы положить, что в захвате скобок : (\w*)
  • тогда мы пропускаем остальные столбцы, если таковые имеются:. (?:\|\w*)*

захватив столбец помещает его в $1, поэтому мы возвращаем это значение, если регулярное выражение соответствует Если нет, то мы возвращаем ноль. , так как эта строка не имеет n-го колонка.

В общем, если вы хотите иметь больше, чем просто слова в ваших колонках (как "{a phrase or two|don't forget about punctuation!|maybe some longer strings that have\na newline or two?}"), а затем просто заменить все \w в регулярном выражении с [^|{}], так что вы можете иметь каждый столбец содержит ничего, кроме фигурную скобку или его вертикальная полоса.


Вот мое предыдущее решение

class String 
    def get_column(n) 
    raise "not a column string" unless self =~ /\A\{\w*(?:\|\w*)*\}\Z/ 
    self[1 .. -2].split('|')[n] 
    end 
end 

Мы используем подобное регулярное выражение, чтобы убедиться, строка содержит набор столбцов или вызвать ошибку. Затем мы снимаем фигурные скобки спереди и сзади (используя self[1 .. -2], чтобы ограничить подстроку, начинающуюся с первого символа и заканчивающуюся рядом с последним), разделите столбцы с помощью символа канала (используя .split('|') для создания массива столбцов) , а затем найдите n-й столбец (используя стандартный поиск в массиве с помощью [n]).

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

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