Регулярний вираз JavaScript: видалити першу і останню скісні риски


83

У мене є такі рядки в javascript:

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

і я хотів би видалити першу і останню скісну риску, якщо вона існує.

Я намагався, ^\/(.+)\/?$але це не працює.

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


Відповіді:


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

"Замініть усі ( /.../g) провідні риски ( ^\/) або ( |) кінцеві риски ( \/$) на порожній рядок."


19
Я змінив це, щоб видалити будь-яку кількість початкових або кінцевих косих рисок, використовуючи "+": replace (/ ^ \ / + | \ / + $ / g, '')
rickumali

Що робити, якщо рядок //www.google.com? //буде пропущено.
Ісаак Феррейра,

@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
Я думаю, що іноді уникнення регулярного виразу допоможе у читабельності, але в цьому випадку використання 1 рядка регулярного виразу та 1 рядка коментарів насправді буде працювати набагато елегантнішим чином.
kroe

3
Це не призведе до видалення дублікатів похилих рисок на початку або в кінці рядка ("// banking / 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)

@benraay Вам потрібна допомога в її розумінні?
Мілен Георгієв

@MilenGeorgiev ні, дякую, я просто казав, що ця версія коду менш читабельна, ніж версія з RegEx, яку іноді важко зрозуміти, але theString.replace(/^\/|\/$/g, '')вона дійсно проста і зрозуміла для людей, які читають код, але, мабуть, повільніша, ніж ця!
benraay
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.