Расщепление строки с последним подчеркиванием - PullRequest
0 голосов
/ 15 января 2019

У меня есть строка типа "a_b_c" или "a_b_c_d" или "a_b_c_d_e". Я хочу разбить строку на последнем подчеркивании.

**input**
'a_b_c'
**output**
a_b
c

**input**
'a_b_c_d'
**output**
a_b_c
d

Я сделал следующее:

a='a_b_c'
a=a.split('_')
last=a.pop
a.delete(last)
p a.join("_")
p last

и добился результата, но я не думаю, что так должно быть. Я надеюсь, что есть какое-то регулярное выражение для достижения этой цели. Кто-нибудь может мне помочь с этим?

Ответы [ 6 ]

0 голосов
/ 16 января 2019
'a_b_c_d_e'.split /_(?!.*_)/
  #=> ["a_b_c_d", "e"]

Отрицательный прогноз (?!.*_) требует, чтобы после совпадения подчеркивания в строке не было другого подчеркивания.

0 голосов
/ 15 января 2019

Вы также можете получить значения, как показано ниже,

> a = a.split('_')
> a[0..-2].join('_')
# => "a_b_c_d" 
> a[-1]
# => "e" 
0 голосов
/ 15 января 2019

Если вы знаете, что эта строка соответствует следующему формату:

str = 'a_b_c_d_e'
# Remainder
str[0...-2]    # -> 'a_b_c_d'

# Last symbol
str[-1]        # -> 'e'
0 голосов
/ 15 января 2019

Вы можете использовать String#rpartition, который ищет заданный шаблон из правого конца строки и разделяется, когда находит его.

'a_b_c_d_e'.rpartition(/_/)
=> ["a_b_c_d", "_", "e"]

s = 'a_b_c_d_e'
parts = s.rpartition(/_/)
[parts.first, parts.last]
=> ["a_b_c_d", "e"]

РЕДАКТИРОВАТЬ: применение советов из комментариев:

'a_b_c_d_e'.rpartition('_').values_at(0,2)
=> ["a_b_c_d", "e"]
0 голосов
/ 15 января 2019

Разделите его с помощью регулярного выражения:

a.split(/_(?=[^_]+$)/)

Пояснение:

соответствует символу _ с положительным прогнозом (? = [^ _] + $)

Соответствует одному символу, отсутствующему в списке ниже [^ _] + и $ устанавливает позицию в конце строки или перед разделителем строки прямо в конце строки (если есть)

0 голосов
/ 15 января 2019

Вам действительно нужно разделить? Как насчет замены _ пробелом? например используя rindex и []=

a[a.rindex('_')] = ' '

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

РЕДАКТИРОВАТЬ: поскольку вопрос был отредактирован, теперь ясно, что OP запрашивает список вместо вывода строки

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