자바 스크립트 정규식 : 첫 번째 및 마지막 슬래시 제거


83

나는 자바 스크립트에 다음 문자열이 있습니다.

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

첫 번째와 마지막 슬래시가 있으면 제거하고 싶습니다.

시도 ^\/(.+)\/?$했지만 작동하지 않습니다.

stackoverflow의 일부 게시물을 읽으면 php에 트림 기능이 있고 그의 javascript 번역 ( http://phpjs.org/functions/trim : 566)을 사용할 수 있지만 "간단한"정규식을 선호합니다.


답변:


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

"모든 ( /.../g) 선행 슬래시 ( ^\/) 또는 ( |) 후행 슬래시 ( \/$)를 빈 문자열로 바꿉니다 ."


19
"+"를 사용하여 선행 또는 후행 슬래시를 제거하도록 수정했습니다. replace (/ ^ \ / + | \ / + $ / g, '')
rickumali

문자열이 있다면 //www.google.com? //놓칠 것입니다.
Isaac Ferreira

@IsaacFerreira이 하나를 사용할 수 /^\s*\/*\s*|\s*\/*\s*$/gm는 이전과 * 추가 슬래시 여러 슬래시 후 몇 가지 가능한 공백을 처리합니다
benraay

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
나는 때때로 regexp를 피하는 것이 가독성에 도움이 될 것이라고 생각하지만,이 경우 한 줄의 regexp와 한 줄의 주석을 사용하면 실제로 훨씬 더 우아한 방식으로 작업이 수행됩니다.
kroe

3
이것은 replace (/ ^ \ / + | \ / + $ / g, '')와 같은 정규식이 문자열 ( "// banking / bon / ita //")의 시작이나 끝에서 중복 슬래시를 제거하지 않습니다. .
diamondsea

나는 그것이 가독성을 높이는 데 도움이되지 않는다고 생각한다. 그것은 단지 누군가가 정규식을 이해할 수 있는지 아닌지에 대한 테스트가 될 뿐이다. 나는 대부분의 사람들이 / ^ \ / | \ / $ / g가 몇 초 후에 무엇을하는지, 특히 다른 비정규 식 코드의 맥락에서 말할 수 있다고 생각합니다. 따라서이 경우 정규식이 더 나은 IMO입니다.
William

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 이해하는 데 도움이 필요하십니까?
Milen Georgiev 2018

@MilenGeorgiev 아니요, 그냥이 버전의 코드가 RegEx를 사용하는 것보다 가독성이 떨어 졌다고 말하고 있었는데 그들은 때때로 이해하기 어렵지만 theString.replace(/^\/|\/$/g, '')코드를 읽는 사람들에게는 정말 간단하고 이해하기 쉽지만 아마도 이것보다 느릴 것입니다!
benraay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.