Biểu thức chính quy Javascript: xóa dấu gạch chéo đầu tiên và cuối cùng


82

Tôi có những chuỗi này trong javascript:

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

và tôi muốn xóa dấu gạch chéo đầu tiên và cuối cùng nếu nó tồn tại.

Tôi đã thử ^\/(.+)\/?$nhưng nó không hoạt động.

Đọc một số bài đăng trong stackoverflow, tôi thấy rằng php có chức năng trim và tôi có thể sử dụng bản dịch javascript của anh ấy ( http://phpjs.org/functions/trim : 566) nhưng tôi thích một biểu thức chính quy "đơn giản" hơn.


Câu trả lời:


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

"Thay thế tất cả ( /.../g) dấu gạch chéo ở đầu ( ^\/) hoặc ( |) dấu gạch chéo ở cuối ( \/$) bằng một chuỗi trống."


19
Tôi đã sửa đổi điều này để loại bỏ bất kỳ số lượng dấu gạch chéo đầu hoặc cuối bằng cách sử dụng "+":
Replace

Nếu là chuỗi thì //www.google.comsao? //sẽ bị bỏ lỡ.
Isaac Ferreira,

@IsaacFerreira bạn có thể sử dụng một trong này /^\s*\/*\s*|\s*\/*\s*$/gmnó sẽ chăm sóc của một số khoảng trắng càng tốt trước và sau dấu gạch chéo và nhiều slashes thêm *
benraay

36

Không có lý do thực sự để sử dụng regex ở đây, các hàm chuỗi sẽ hoạt động tốt:

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"

Xem điều này trong hành động trên jsFiddle .

Người giới thiệu:


3
Tôi nghĩ rằng đôi khi tránh regexp sẽ giúp ích cho việc dễ đọc, nhưng trong trường hợp này, việc sử dụng 1 dòng regexp và 1 dòng chú thích sẽ thực sự công việc theo cách thanh lịch hơn nhiều.
kroe

3
Thao tác này sẽ không xóa các dấu gạch chéo trùng lặp ở đầu hoặc cuối chuỗi ("// banking / bon / ita //") mà một regex như thay thế (/ ^ \ / + | \ / + $ / g, '') sẽ .
diamondsea

Tôi không nghĩ rằng nó thậm chí còn giúp tăng khả năng đọc, nó chỉ trở thành một bài kiểm tra mức độ mà ai đó có thể hiểu được regex hay không. Tôi nghĩ rằng hầu hết mọi người có thể biết / ^ \ / | \ / $ / g làm gì sau một vài giây, đặc biệt là trong ngữ cảnh của mã không phải regex khác. Vì vậy, trong trường hợp này, regex là IMO tốt hơn.
William

7

Trong trường hợp nếu sử dụng RegExp không phải là một tùy chọn hoặc bạn phải xử lý các trường hợp góc trong khi làm việc với URL (chẳng hạn như dấu gạch chéo kép / ba hoặc dòng trống không có thay thế phức tạp) hoặc sử dụng xử lý bổ sung, thì đây là cách ít rõ ràng hơn, nhưng nhiều chức năng hơn- giải pháp phong cách:

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

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

console.log(trimmedUrls);

Trong đoạn mã này, filter()hàm có thể triển khai logic phức tạp hơn là chỉ lọc các chuỗi trống (đó là hành vi mặc định).

Lời cảnh báo - đây không nhanh như các đoạn trích khác ở đây.


3

Đề phòng trường hợp ai đó cần tối ưu hóa sớm ở đây ...

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 bạn có cần giúp đỡ để hiểu nó không?
Milen Georgiev

@MilenGeorgiev không, cảm ơn tôi chỉ nói rằng phiên bản mã này khó đọc hơn phiên bản với RegEx, chúng đôi khi khó hiểu nhưng theString.replace(/^\/|\/$/g, '')thực sự đơn giản và dễ hiểu đối với những người đọc mã, nhưng có lẽ chậm hơn phiên bản này!
benraay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.