Как удалить из строки перед __

#ruby-on-rails #ruby

Вопрос:

Я создаю приложение Rails 5.2. В этом приложении я получил результаты от разных поставщиков (я создаю интернет-магазин).

Имя поставщика услуг доставки в этом формате:

 dhl_freight__233433
 

Это также может быть в таком формате:

 postal__US-320202
 

Как я могу удалить все, что было до (и включая)__, чтобы все, что осталось, было после___, как, например, 233433.

Возможно, какое-то регулярное выражение.

Ответ №1:

Очень простым подходом было бы использовать String#split , а затем выбрать вторую часть, которая является last частью в этом примере:

 "dhl_freight__233433".split('__').last
#=> "233433"

"postal__US-320202".split('__').last
#=> "US-320202"
 

Комментарии:

1. участие в конкурсе тоже приятно.

Ответ №2:

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

 p "dhl_freight__233433".match(/__/).post_match
# another (magic) way to acces the post_match part:
p 

Постскриптум: Я сам кое-что узнал из этого вопроса: вам даже не нужно использовать регулярное выражение, чтобы это сработало. Просто  "asddfg__qwer".match("__").post_match  делает трюк (он выполняет преобразование в регулярное выражение для вас)


Комментарии:

1. Да, часто бывает полезно просмотреть документы даже для знакомых методов, здесь строка#соответствует . Я также не знал, что аргумент ("patttern") может быть строкой (в этом случае он преобразуется в регулярное выражение), и мне напомнили, что match в качестве необязательного второго аргумента используется индекс, с которого должен начинаться поиск, который не часто можно увидеть...

2. ...Более того, я забыл о MatchData#post_match MatchData#pre_match ). (Обратите внимание на написание post_match вашего последнего предложения.)

3. Спасибо @CarySwoveland, орфография улучшена

Ответ №3:

 r = /[^_] z/
 
 "dhl_freight__233433"[r] #=> "233433"
"postal__US-320202"[r]   #=> "US-320202"
 

Регулярное выражение соответствует одному или нескольким символам, отличным от символа подчеркивания, за которым следует конец строки ( z ). ^ В начале класса символов написано: "кроме любого из следующих символов".

См. Строку#[].

Это предполагает, что последнему подчеркиванию предшествует подчеркивание. Если последнему подчеркиванию не предшествует подчеркивание, в этом случае совпадения быть не должно, добавьте положительный взгляд сзади:

 r = /(?<=__[^_] z/
 

Это требует, чтобы совпадению предшествовали два подчеркивания.

Ответ №4:

Существует множество способов извлечения чисел из строки с помощью ruby. Я надеюсь, что вы пытаетесь извлечь числа из строки. Вот некоторые из способов сделать это.

Ссылка - http://www.ruby-forum.com/topic/125709

 line.delete("^0-9")

line.scan(/d/).join('')

line.tr("^0-9", '')
 

В приведенном выше delete примере быстрее всего обрезать числа из строк.

Все вышеперечисленное извлекает числа из строки и соединяет их. Если строка "String-with-67829___numbers-09764" такая, то выход будет таким "6782909764"

На случай, если вы хотите, чтобы числа разделились следующим образом ["67829", "09764"]

 line.split(/[^d]/).reject { |c| c.empty? }
 

Надеюсь, эти ответы помогут вам! Счастливого кодирования 🙂

Постскриптум: Я сам кое-что узнал из этого вопроса: вам даже не нужно использовать регулярное выражение, чтобы это сработало. Просто "asddfg__qwer".match("__").post_match делает трюк (он выполняет преобразование в регулярное выражение для вас)

Комментарии:

1. Да, часто бывает полезно просмотреть документы даже для знакомых методов, здесь строка#соответствует . Я также не знал, что аргумент («patttern») может быть строкой (в этом случае он преобразуется в регулярное выражение), и мне напомнили, что match в качестве необязательного второго аргумента используется индекс, с которого должен начинаться поиск, который не часто можно увидеть…

2. …Более того, я забыл о MatchData#post_match MatchData#pre_match ). (Обратите внимание на написание post_match вашего последнего предложения.)

3. Спасибо @CarySwoveland, орфография улучшена

Ответ №3:



Регулярное выражение соответствует одному или нескольким символам, отличным от символа подчеркивания, за которым следует конец строки ( z ). ^ В начале класса символов написано: «кроме любого из следующих символов».

См. Строку#[].

Это предполагает, что последнему подчеркиванию предшествует подчеркивание. Если последнему подчеркиванию не предшествует подчеркивание, в этом случае совпадения быть не должно, добавьте положительный взгляд сзади:


Это требует, чтобы совпадению предшествовали два подчеркивания.

Ответ №4:

Существует множество способов извлечения чисел из строки с помощью ruby. Я надеюсь, что вы пытаетесь извлечь числа из строки. Вот некоторые из способов сделать это.

Ссылка — http://www.ruby-forum.com/topic/125709


В приведенном выше delete примере быстрее всего обрезать числа из строк.

Все вышеперечисленное извлекает числа из строки и соединяет их. Если строка "String-with-67829___numbers-09764" такая, то выход будет таким "6782909764"

На случай, если вы хотите, чтобы числа разделились следующим образом ["67829", "09764"]


Надеюсь, эти ответы помогут вам! Счастливого кодирования 🙂