Как использовать Regex для проверки массива URL-адресов, чтобы увидеть, вернусь ли я к исходной папке - PullRequest
0 голосов
/ 05 июня 2019

Допустим, у нас есть массив строк, и каждая строка имеет либо ./, либо ../, где ./ означает вход на следующий уровень текущей папки, а ../ означает возврат к папке верхнего уровня,Таким образом, массив будет что-то вроде [./, ../, ../, ./].И мы хотим проверить, вернемся ли мы в конечном итоге к исходной папке.

Я знаю, что эта проблема довольно проста.Я попытался выполнить итерацию массива, и для каждого элемента я удаляю последний символ в строке, т. Е. '/', Используя str.slice(0,-1), тогда я считаю каждый '..' и '.'чтобы увидеть, равны ли они.

Однако я чувствую, что мой код хрупок, и очень хотел бы посмотреть, как кто-то может использовать регулярные выражения для решения этой проблемы.

let numOfGoingDeeper = 0;
let numOfGoingBack = 0;
arr.forEach(str => {
if(str.slice(0,-1) === '..') {
  numOfGoingBack++;
} else if(str.slice(0,-1) === '.') {
  numOfGoingDeeper++;
}
}
return numOfGoingDeeper === numOfGoingBack
))

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Ваш код уже работает достаточно хорошо. Если вы хотите больше регулярности и скорости, вы можете посчитать результаты .match.

function pathFunction(arr) {
  let inputString = arr.join();
  let regex = /\.\.\//g; // To count and remove all ../
  
  let numOfGoingDeeper = (inputString.match(regex) || []).length;
  inputString = inputString.replace(regex);
  
  regex = /\.\//g; // To count all ./
  let numOfGoingBack = (inputString.match(regex) || []).length;

  return numOfGoingDeeper === numOfGoingBack;
}

console.log ( pathFunction(['../','./','../','./']) );

Это не ваш вопрос, но на всякий случай: в UNIX ../ означает перейти в каталог, но ./ представляет текущий каталог. Так что путь .././.././ будет равен пути ../../

0 голосов
/ 05 июня 2019

Тебе даже не нужно регулярное выражение. Вы можете выполнить простой поиск / замену, чтобы заменить каждое "../" на -1 и каждое "./" на +1, а затем суммировать результаты.

var arr = ["./", "../", "../", "./"];

var new_arr = arr.map(x => x.replace("../", -1).replace("./", 1));

var deplacement = new_arr.reduce((acc, val) => acc + parseInt(val, 10), 0);

console.log(deplacement)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...