#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"]
Надеюсь, эти ответы помогут вам! Счастливого кодирования 🙂