#javascript
#javascript
Вопрос:
строка 1: 10016/Documents/abc.pdf
row2: 10016-10017/10017/Documents/folder1/folder2/xyz.pdf
Я пытаюсь извлечь все символы, начиная с /Documents, но без последней части (имя файла)
В строке 1 я хочу получить /Documents/
В строке 2 я хочу получить /Documents/folder1/folder2/
Я пытался
var temp1 = FullPath.split("/Documents/")[0];
var A_Fpath = temp1.split("/");
A_Fpath = A_Fpath[A_Fpath.length - 1];
Комментарии:
1. является
Documents
постоянным?2. Что возвращает ваша попытка?
3. да, Documents является константой
4. мой код возвращает 10016 и 10016-10017 для temp1 10016 и 10017 для A_Fpath
Ответ №1:
Простое регулярное выражение сделает свое дело:
//Documents.*//
/ start the regex
/ match literally a "/" (the is to escape the / reserved character)
Documents match literally the word "Documents" (case sensitive
.* match 0 or more characters (any characters)
/ match literally a "/"
/ end the regex
This works because regex will attempt to match the longest possible string
of characters that match the regex.
const row1 = "10016/Documents/abc.pdf";
const row2 = "10016-10017/10017/Documents/folder1/folder2/xyz.pdf";
const regex = //Documents.*//;
const val1 = row1.match(regex)[0];
const val2 = row2.match(regex)[0];
console.log(val1);
console.log(val2);
Комментарии:
1. спасибо, это может не сработать, если имя файла содержит «Documents»?
2. Это работает, даже если имя файла имеет / имеет «Documents», поскольку оно специально ищет
"/"
после слова «Documents», а имя файла не может иметь"/"
… посмотрите на ссылку Regex101 из моего ответа
Ответ №2:
Если бы в javascript был взрослый движок регулярных выражений, можно было бы использовать положительную, не захватывающую группу ожидания, чтобы определить, когда остановиться.
Поскольку в javascript этого нет, простой, понятный и более эффективный способ — вообще не использовать регулярное выражение. Алгоритм прост:
- Найдите [первый / крайний слева]
/Documents
в исходном тексте, затем - Найдите последнее / самое правое вхождение
/
в исходном тексте - Разберитесь с двумя особыми случаями, когда:
- Исходная строка вообще не содержит
/Documents
и - Самый правый
/
— это/
in/Documents
- Исходная строка вообще не содержит
- В противном случае, как указано выше, возвращает желаемую подстроку, простирающуюся от
/Documents
до последнего включительно/
Вот так:
function getInterestingBitsFrom(path) {
const i = path.indexOf('/Documents');
const j = path.lastIndexOf('/');
const val = i < 0 ? undefined // no '/Documents' in string
: i === j ? path.slice(i) // last '/' in string is the '/' in '/Documents'
: path.slice(i, j 1) // '/Documents/' or '/Documents/.../'
;
return retVal;
}
Это также имеет похвальное преимущество в том, что его легко понять тому, кто должен понять, чего вы пытались достичь.