Javascript отделка двойной косой чертой - PullRequest
0 голосов
/ 16 декабря 2018

Я бы хотел обрезать //a/url/// до a/url.Есть несколько вопросов о Stackoverflow, но они не работают, решают другую проблему или являются слишком длинными и сложными.

Приведенный ниже код работает и основан на регулярном выражении Javascript: удалите первый и последнийslash

function trimSlashes(str) {
  str = str.replace(/^\/|\/$/g, '');
  return str.replace(/^\/|\/$/g, '');
};

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

Тестовый пример

let str1 = trimSlashes('/some/url/here/');
let str2 = trimSlashes('//some/other/url/here///');

Ожидаемый результат

some/url/here
some/other/url/here

Список пожеланий

  • Только одно регулярное выражение
  • Чем короче или быстрее, тем лучше

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018

При регулярных выражениях вы должны быть осторожны с непреднамеренными совпадениями.например, хотите ли вы урезать косую черту, когда текст «// и это комментарий в некоторой строке текста //»?

Если вы не хотите обрезать подобные вещи, вам нужночтобы быть немного более осторожным с регулярным выражением, как насчет этого?

let regex = /^\/+([\w\/]+?)\/+$/;
let matches = regex.exec("//some/other/url/here///");
let url = matches[1];

https://regex101.com/r/K8CnxP/1

0 голосов
/ 16 декабря 2018

Вот еще один вариант без регулярных выражений, но с функциональным чутьем.Я не знаю о производительности, но мне было весело писать ее, и она кажется менее загадочной.

const newString = '//some/other/url/here///'
.split('/')
.filter(s => s)
.join('/')

Редактировать:

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

https://jsperf.com/regex-vs-functional/1

0 голосов
/ 16 декабря 2018

replace(/^\/+|\/+$/g, '') - это то, что вы ищете:

Результат с обоими тестами:

> '/some/url/here/'.replace(/^\/+|\/+$/g, '');
"some/url/here"

> '//some/other/url/here///'.replace(/^\/+|\/+$/g, '');
"some/other/url/here"

Объяснено:

^\/+  # one or more forward slashes at the beginning
|     # or
\/+$  # one or more forward slashes at the end
...