#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:
Комментарии:
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]) )