Так что это решение прямо сейчас мне нравится:
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]
).
Я просто понял, что, пока я использовал регулярное выражение для проверки строки, я мог бы также использовать ее для захвата столбца.
ленты брекеты, разделить на трубу. И вы, вероятно, имеете в виду 'get_column (2)' => '' a'' – SilentGhost