Как извлечь путь из строки в ruby ​​(между 1-й и последней косой чертой включительно)

Я пишу ruby-скрипт, который проходит через текстовый файл и находит все строки, начинающиеся с выходного пути, и сохраняет его в строку (linefromtextfile) для этой строки. Обычно он находит строки, как показано ниже.

"output_path":"/data/server/output/1/test_file.txt","text":
"output_path":"/data/server/output/2/test_file.txt","text":

И я хочу извлечь из строк только путь (pathtokeep) и записать в файл, то есть:

/data/server/output/1/
/data/server/output/2/

Я пробовал это RegEx, но он не работает:

pathtokeep=linefromtextfile.split(?:\$/.*?/)([^/]*?\.\S*)

Пожалуйста, кто-нибудь посоветуйте здесь мой RegEx - это правильный путь или есть более простой способ сделать это?


person adamjth    schedule 09.04.2016    source источник
comment
Вам не нужно благодарить автора каждого ответа. Если вы это сделаете, однажды вы столкнетесь с выбором: поблагодарить кого-то за плохой ответ или не благодарить только этого человека, оставив очевидный подтекст. Если вы посмотрите на другие вопросы, вы увидите, что это просто не делается в SO.   -  person Cary Swoveland    schedule 11.04.2016
comment
В будущем, когда вы будете приводить пример, будет полезно присвоить переменную каждому входному объекту. Здесь это может быть str = '"output_path":"...xt":'. Таким образом, читатели могут ссылаться на эти переменные в ответах и ​​комментариях, не определяя их.   -  person Cary Swoveland    schedule 11.04.2016


Ответы (3)


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

line = '"output_path":"/data/server/output/1/test_file.txt","text":'

path = line.split(/:"|",/)[1]
# => "/data/server/output/1/test_file.txt"

basename = File.basename(path)
# => "test_file.txt"

File.dirname(path) + '/'
# => "/data/server/output/1/"
person guitarman    schedule 09.04.2016
comment
Я улучшил его с помощью File.dirname(path) вместо path.gsub(base name, '') - person guitarman; 08.01.2017

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

str = '"output_path":"/data/server/output/1/test_file.txt","text":'

r = /
    :"      # match a colon and double quote
    (.+?)   # match one or more of any character, lazily, in capture group 1 
    "       # match a double quote
    /x      # free-spacing regex definition mode

File.dirname(str[r,1])
  #=> "/data/server/output/1"

Если вам действительно нужна косая черта в конце,

File.dirname(str[r,1]) << "/"
  #=> "/data/server/output/1/"

Если вам это нужно,

File.basename(str[r,1])
  #=> "test_file.txt"

Я оставлю OP чтение и запись в файлы.

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

r = /
    (?<=:") # match a colon followed by a double-quote in a positive lookbehind
    .+      # match one more characters, greedily
    \/      # match a forward slash
    /x

str[r]
  #=> "/data/server/output/1/"

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

person Cary Swoveland    schedule 09.04.2016
comment
Спасибо @guitarman, чей ответ напомнил мне, что мне не нужно экранировать кавычки в регулярном выражении. - person Cary Swoveland; 09.04.2016
comment
Спасибо за ваши советы - person adamjth; 11.04.2016