Вернуть строку до строки с совпадением в Ruby

Как вы возвращаете часть строки до первого экземпляра " #" или " Apt"?

Я знаю, что я мог бы разбить строку на массив на основе "#" или "Apt", а затем вызвать .first, но должен быть более простой способ.

Ответ 1

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

string.split(/#|Apt/).first

Ответ 2

Я бы написал метод, чтобы сделать его понятным. Что-то вроде этого, например:

class String
    def substring_until(substring)
        i = index(substring)
        return self if i.nil?
        i == 0 ? "" : self[0..(i - 1)]
    end
end

Ответ 3

Используйте метод String # []. Вот так:

[
  '#foo',
  'foo#bar',
  'fooAptbar',
  'asdfApt'
].map { |str| str[/^(.*)(#|Apt)/, 1] } #=> ["", "foo", "foo", "asdf"]

Ответ 4

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

^.*(#|Apt)

Или, если вы поместите строку в токенизатор, вы можете сделать что-то с этим, но это будет более жестким, если вы ищете слово, а не только один символ.