регулярное выражение и разделение в рубине - PullRequest
0 голосов
/ 25 января 2019

У меня есть большая строка этого формата:

FA dir_name1 file_name1
FA dir_name1 file_name2
FA dir_name2 file_name1
FA dir_name2 file_name2
....

Я думал, можем ли мы написать выражение регулярного выражения при выполнении разбиения, которое возвращает мне массив, состоящий из этого:

["dir_name1/file_name1", "dir_name1/file_name2", "dir_name2/file_name1", "dir_name2/file_name2"]

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

Есть ли другой способ сделать это?

Ответы [ 3 ]

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

Это должно работать даже в допотопном рубине:

input.lines.map { |line| line.strip[2..-1].sub(' ', '/') }

Вы должны сделать это в два шага, потому что любая функция, которая может разделить (split, lines, scan), не может дать вам косую черту.

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

Я просто хотел попробовать использовать Ruby 2.6 Object#then:

input.lines.map { |s| s.split.then { |e| e.last(2).join('/') } }

#=> ["dir_name1/file_name1", "dir_name1/file_name2", "dir_name2/file_name1", "dir_name2/file_name2"]
0 голосов
/ 25 января 2019

Если вы хотите получить массив из строки, требуется некоторое разбиение.

input.scan(/(?<=^FA ).*$/).
      map { |e| e.split.join('/') }
#⇒ [
#   [0] "dir_name1/file_name1",
#   [1] "dir_name1/file_name2",
#   [2] "dir_name2/file_name1",
#   [3] "dir_name2/file_name2"
#  ]

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


Другим способом было бы просто разделить несколько раз:

input.
  split($/).
  map { |line| line.split[1..-1].join('/') }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...