Как извлекать символы, начиная с определенной строки, до последнего массива символов

#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); 

Вот ссылка на регулярное выражение 101, чтобы проверить его и посмотреть больше информации об этом конкретном регулярном выражении.

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

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;  
}
 

Это также имеет похвальное преимущество в том, что его легко понять тому, кто должен понять, чего вы пытались достичь.