Регулярное выражение Javascript: удалите первую и последнюю косую черту

83

У меня есть эти строки в javascript:

/banking/bonifici/italia
/banking/bonifici/italia/

и я хотел бы удалить первую и последнюю косую черту, если она существует.

Я пробовал, ^\/(.+)\/?$но не получается.

Прочитав пост в stackoverflow, я обнаружил, что php имеет функцию обрезки, и я мог бы использовать его перевод javascript ( http://phpjs.org/functions/trim : 566), но я бы предпочел «простое» регулярное выражение.

CorPao
источник

Ответы:

194
return theString.replace(/^\/|\/$/g, '');

«Замените все ( /.../g) ведущую косую черту ( ^\/) или ( |) конечную косую черту ( \/$) пустой строкой».

Kennytm
источник
19
Я изменил это, чтобы удалить любое количество начальных или конечных косых черт, используя "+": replace (/ ^ \ / + | \ / + $ / g, '')
rickumali
Что если строка есть //www.google.com? //будет пропущен.
Isaac Ferreira
@IsaacFerreira, вы можете использовать этот, /^\s*\/*\s*|\s*\/*\s*$/gmон позаботится о некоторых возможных пробелах до и после косой черты и нескольких косых
черт,
36

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

var string = "/banking/bonifici/italia/";
if (string.charAt(0) == "/") string = string.substr(1);
if (string.charAt(string.length - 1) == "/") string = string.substr(0, string.length - 1);
// string => "banking/bonifici/italia"

Посмотрите это в действии на jsFiddle .

Рекомендации:

Даниэль Вандерслуис
источник
3
Я думаю, что иногда отказ от регулярного выражения помогает улучшить читаемость, но в этом случае использование одной строки регулярного выражения и одной строки комментария фактически выполнит задание гораздо более элегантным способом.
kroe
3
Это не удалит повторяющиеся косые черты в начале или конце строки ("// bank / bon / ita //"), которые регулярное выражение, такое как replace (/ ^ \ / + | \ / + $ / g, ''), будет .
Diamondsea
Я не думаю, что это даже помогает улучшить читаемость, это просто проверка того, насколько кто-то может понять регулярное выражение или нет. Я думаю, что большинство людей могут сказать, что делает / ^ \ / | \ / $ / g, через несколько секунд, особенно в контексте другого кода, отличного от регулярного выражения. Итак, в этом случае регулярное выражение лучше IMO.
Уильям
7

В случае, если использование RegExp не является вариантом , или вам нужно обрабатывать угловые случаи при работе с URL-адресами (например, двойные / тройные косые черты или пустые строки без сложных замен) или использовать дополнительную обработку, вот менее очевидный, но более функциональный: стилевое решение:

const urls = [
  '//some/link///to/the/resource/',
  '/root',
  '/something/else',
];

const trimmedUrls = urls.map(url => url.split('/').filter(x => x).join('/'));

console.log(trimmedUrls);

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

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

Поврежденный органический
источник
3

На всякий случай, что кому-то тут нужна преждевременная оптимизация ...

http://jsperf.com/remove-leading-and-trailing-slashes/5

var path = '///foo/is/not/equal/to/bar///'
var count = path.length - 1
var index = 0

while (path.charCodeAt(index) === 47 && ++index);
while (path.charCodeAt(count) === 47 && --count);

path = path.slice(index, count + 1)
yckart
источник
@benraay, тебе нужна помощь в его понимании?
Милен Георгиев
@MilenGeorgiev нет, спасибо, я просто сказал, что эта версия кода менее читаема, чем версия с RegEx, которую иногда трудно понять, но theString.replace(/^\/|\/$/g, '')она действительно проста и понятна для людей, читающих код, но, вероятно, медленнее, чем эта!
benraay