Regex: сопоставить кратчайший шаблон между двумя возможными разделителями

Я борюсь с регулярным выражением. В своем примере я использую R, но приветствуется любое совместимое регулярное выражение.

Вот в чем проблема: рассмотрим этот пример:

test <- c("truc/truc/plouf.xlsx","plouf.xlsx","truc/plouf.xlsx")

Я бы хотел, чтобы plouf извлекался каждый раз. Я пытался:

library(stringr)
str_extract(test,"(?<=\/{0,1}).+(?=\\.xlsx)") 

Что дает мне

[1] "трук/трук/плуф" "плуф" "трук/плуф"

Я наивно думал, что использование ленивого .+? в str_extract(test,"(?<=\/{0,1}).+?(?=\\.xlsx)") решит проблему, но это не так.

Как мне поступить?


56
1

Ответ:

Решено

Чтобы извлечь имя файла терминала (имеющее расширение), у вас все будет в порядке, используя:

library(stringr)

test <- c("truc/truc/plouf.xlsx", "plouf.xlsx", "truc/plouf.xlsx")
files <- str_extract(test, "[^/]+(?=\\.\\w+$)")
files

[1] "plouf" "plouf" "plouf"

Шаблон регулярного выражения здесь говорит о соответствии:

  • [^/]+ соответствует любому одному или нескольким символам, но не косой черте
  • (?=\\.\\w+$) пока не посмотрю вперед и не увижу расширение файла (но не совпадающее с ним)