Регулярное выражение для извлечения пути из файла

#javascript #regex

#javascript #регулярное выражение

Вопрос:

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

 let filepath_1 = "./path/to/file.js";     // ./path/to/
let filepath_2 = "./path/to/file.min.js"; // ./path/to/
let filepath_3 = "./path/to/";            // ./path/to/
let filepath_4 = "./path/to";             // ./path/to
let filepath_5 = "/path/to";              // /path/to
let filepath_6 = "path/to";               // path/to 
 

Косые черты в конечных результатах на самом деле не имеют значения, если файл отсутствует в результатах и он не считает, что to это имя файла..

До сих пор я прилагал все усилия file.replace(/[^/]*$/, "") , но это приведет к удалению to in /path/to . Мне нужна некоторая логика в отношении символа «.»

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

1. Имена папок также могут содержать точку (.) в имени.

2. В именах файлов не обязательно должны быть точки.

3. В моих папках не будет точек, а в моих файлах будут. 🙂

Ответ №1:

Вот ответ:

https://regex101.com/r/XPalNK/2

Замените этот шаблон пустой строкой.

 (!?[w-] ..*)
 

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

1. Что ж, это было действительно умно. 1

2. Почему вы пытаетесь сопоставить восклицательный знак? Во вводе OP их нет.

3. @RyszardCzech восклицательный знак вопросительный знак означает необязательный ввод

Ответ №2:

Регулярное выражение может не дать наиболее читаемого решения в этом случае, поскольку существует if/then неявное. Как насчет простого split ?

 p = ["./path/to/file.js", "./path/to/file.min.js", "./path/to/", "./path/to", "/path/to", "path/to"]
output = p.map(s => {

  // Begin
  a = s.split("/")
  if (a[a.length - 1].includes(".")) {
    a.pop()
    return a.join("/")   "/"
  }
  return a.join("/")
  // End

})

console.log("output", output) 

Ответ №3:

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

 .replace(/[^/] .w $/, '')
 

Смотрите демонстрацию регулярных выражений. Регулярное выражение будет соответствовать одному или нескольким символам, отличным от
a / (with [^/] ), затем a . (with . ), а затем любому одному или нескольким словесным символам ( w ) в конце строки ( $ ).

Вы можете использовать следующее, чтобы извлечь то, что вам нужно:

 /^(?:.*/)?[^/] /[^/] /?/
 

Смотрите демонстрацию регулярных выражений. Подробные сведения:

  • ^ — начало строки
  • (?:.*/)? — необязательная последовательность из нуля или более . символов, за которой следует /
  • [^/] — ноль или более символов, отличных от /
  • / / символ
  • [^/] — ноль или более символов, отличных от /
  • /? — необязательный / символ

Смотрите демонстрацию JavaScript:

 let filepath_1 = "./path/to/file.js";     // ./path/to/
let filepath_2 = "./path/to/file.min.js"; // ./path/to/
let filepath_3 = "./path/to/";            // ./path/to/
let filepath_4 = "./path/to";             // ./path/to
let filepath_5 = "/path/to";              // /path/to
let filepath_6 = "path/to";               // path/to 
const arr = [filepath_1, filepath_2, filepath_3, filepath_4, filepath_5, filepath_6];
// Replacing
const reg = /[^/] .w $/;
arr.forEach( x => console.log(x, "=>", x.replace(reg, '')) )
// Matching
const regex = /^(?:.*/)?[^/] /[^/] /?/g;
arr.forEach( x => console.log(x, "=>", x.match(regex)?.[0]) )