답변:
한 줄이면 충분합니다.
var x = '|f|oo||';
var y = x.replace(/^\|+|\|+$/g, '');
document.write(x + '<br />' + y);
^\|+ beginning of the string, pipe, one or more times
| or
\|+$ pipe, one or more times, end of the string
일반적인 해결책 :
function trim (s, c) {
if (c === "]") c = "\\]";
if (c === "\\") c = "\\\\";
return s.replace(new RegExp(
"^[" + c + "]+|[" + c + "]+$", "g"
), "");
}
chars = ".|]\\";
for (c of chars) {
s = c + "foo" + c + c + "oo" + c + c + c;
console.log(s, "->", trim(s, c));
}
내가 잘 이해했다면 특정 문자가 문자열의 시작 또는 끝에있는 경우에만 제거하고 싶습니다 (예 : ||fo||oo||||
가되어야 함 foo||oo
). 다음과 같이 임시 기능을 생성 할 수 있습니다.
function trimChar(string, charToRemove) {
while(string.charAt(0)==charToRemove) {
string = string.substring(1);
}
while(string.charAt(string.length-1)==charToRemove) {
string = string.substring(0,string.length-1);
}
return string;
}
아래 코드로이 기능을 테스트했습니다.
var str = "|f|oo||";
$( "#original" ).html( "Original String: '" + str + "'" );
$( "#trimmed" ).html( "Trimmed: '" + trimChar(str, "|") + "'" );
다음과 같은 정규식을 사용할 수 있습니다.
var x = "|f|oo||";
var y = x.replace(/^[\|]+|[\|]+$/g, "");
alert(y); // f|oo
최신 정보:
이것을 함수로 일반화하려면 다음을 수행 할 수 있습니다.
var escapeRegExp = function(strToEscape) {
// Escape special characters for use in a regular expression
return strToEscape.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
};
var trimChar = function(origString, charToTrim) {
charToTrim = escapeRegExp(charToTrim);
var regEx = new RegExp("^[" + charToTrim + "]+|[" + charToTrim + "]+$", "g");
return origString.replace(regEx, "");
};
var x = "|f|oo||";
var y = trimChar(x, "|");
alert(y); // f|oo
이 질문을 최신 상태로 유지하려면 :
여기에 ES6 스프레드 연산자를 사용하여 정규식 함수를 선택하는 방법이 있습니다.
function trimByChar(string, character) {
const first = [...string].findIndex(char => char !== character);
const last = [...string].reverse().findIndex(char => char !== character);
return string.substring(first, string.length - last);
}
@fabian의 주석 이후 버전 개선 (동일한 문자 만 포함 된 문자열 처리 가능)
function trimByChar(string, character) {
const arr = Array.from(string);
const first = arr.indexOf(character);
const last = arr.reverse().indexOf(character);
return string.substring(first + 1, string.length - last - 1);
}
[].concat(string)
하고 원하는 결과가 아닌 것으로 변환합니다 . 사용 Array.from(string)
하면 작동합니다.
보기 쉬운 정규식없는 버전 :
const trim = (str, chars) => str.split(chars).filter(Boolean).join(chars);
가장자리에서 문자가 반복되지 않는다고 확신하는 사용 사례를 위해.
const trim = (str, chars) => str.split(chars).filter(x => { Boolean(x); console.log(typeof(x), x, Boolean(x)); }).join(chars); const str = "#//#//abc#//test#//end#//"; console.log(trim(str, '#//'));
더 긴 문자열을 처리하는 경우 할당 된 문자열 수를 0 또는 1로 줄임으로써 대부분의 다른 옵션보다 성능이 우수하다고 생각합니다.
function trim(str, ch) {
var start = 0,
end = str.length;
while(start < end && str[start] === ch)
++start;
while(end > start && str[end - 1] === ch)
--end;
return (start > 0 || end < str.length) ? str.substring(start, end) : str;
}
// Usage:
trim('|hello|world|', '|'); // => 'hello|world'
또는 여러 문자 집합에서 트리밍하려는 경우 :
function trimAny(str, chars) {
var start = 0,
end = str.length;
while(start < end && chars.indexOf(str[start]) >= 0)
++start;
while(end > start && chars.indexOf(str[end - 1]) >= 0)
--end;
return (start > 0 || end < str.length) ? str.substring(start, end) : str;
}
// Usage:
trimAny('|hello|world ', [ '|', ' ' ]); // => 'hello|world'
// because '.indexOf' is used, you could also pass a string for the 2nd parameter:
trimAny('|hello| world ', '| '); // => 'hello|world'
편집 : 재미를 위해 (개별 문자가 아닌) 단어 다듬기
// Helper function to detect if a string contains another string
// at a specific position.
// Equivalent to using `str.indexOf(substr, pos) === pos` but *should* be more efficient on longer strings as it can exit early (needs benchmarks to back this up).
function hasSubstringAt(str, substr, pos) {
var idx = 0, len = substr.length;
for (var max = str.length; idx < len; ++idx) {
if ((pos + idx) >= max || str[pos + idx] != substr[idx])
break;
}
return idx === len;
}
function trimWord(str, word) {
var start = 0,
end = str.length,
len = word.length;
while (start < end && hasSubstringAt(str, word, start))
start += word.length;
while (end > start && hasSubstringAt(str, word, end - len))
end -= word.length
return (start > 0 || end < str.length) ? str.substring(start, end) : str;
}
// Usage:
trimWord('blahrealmessageblah', 'blah');
이렇게하면 한 번에 여러 문자를자를 수 있습니다.
String.prototype.trimChars = function (c) {
var re = new RegExp("^[" + c + "]+|[" + c + "]+$", "g");
return this.replace(re,"");
}
var x = "|f|oo||";
x = x.trimChars('|'); // f|oo
var y = "..++|f|oo||++..";
y = y.trimChars('|.+'); // f|oo
var z = "\\f|oo\\"; // \f|oo\
// For backslash, remember to double-escape:
z = z.trimChars("\\\\"); // f|oo
프로그램에서 이러한 함수를 정의하면 문자열은 trim
주어진 모든 문자를자를 수 있는 업그레이드 된 버전을 갖게됩니다 .
String.prototype.trimLeft = function(charlist) {
if (charlist === undefined)
charlist = "\s";
return this.replace(new RegExp("^[" + charlist + "]+"), "");
};
String.prototype.trim = function(charlist) {
return this.trimLeft(charlist).trimRight(charlist);
};
String.prototype.trimRight = function(charlist) {
if (charlist === undefined)
charlist = "\s";
return this.replace(new RegExp("[" + charlist + "]+$"), "");
};
var withChars = "/-center-/"
var withoutChars = withChars.trim("/-")
document.write(withoutChars)
내가 아는 한, jQuery에는 귀하가 요청하는 방법이 내장 된 기능이 없습니다. 그러나 javascript를 사용하면 replace를 사용하여 문자열의 내용을 변경할 수 있습니다.
x.replace(/|/i, ""));
이것은 | 아무것도없이.
$
끝에서만 이런 식으로 던지 "||spam|||".replace(/\|+$/g, "")
거나 ^
시작시에만 이런 식으로 :"||spam|||".replace(/^\|+/g, "")
이것은 모든 선행 및 후행 구분자를 트리밍합니다.
const trim = (str, delimiter) => {
const pattern = `[^\\${delimiter}]`;
const start = str.search(pattern);
const stop = str.length - str.split('').reverse().join('').search(pattern);
return str.substring(start, stop);
}
const test = '||2|aaaa12bb3ccc|||||';
console.log(trim(test, '|')); // 2|aaaa12bb3ccc
lodash를 살펴보고 어떻게 구현했는지 trim
기능 합니다.
문서 및 소스 는 Lodash Trim 을 참조하십시오. 트리밍을 수행하는 정확한 코드를 볼 수 있습니다.
나는 이것이 귀하의 질문에 정확한 답을 제공하지 않는다는 것을 알고 있지만 다른 사람들이 유용하다고 생각할 수 있으므로 그러한 질문에 대한 라이브러리에 대한 참조를 설정하는 것이 좋습니다.
이 작업을 해결하는 가장 좋은 방법은 다음과 같습니다 (PHP trim
함수 와 유사 ).
function trim( str, charlist ) {
if ( typeof charlist == 'undefined' ) {
charlist = '\\s';
}
var pattern = '^[' + charlist + ']*(.*?)[' + charlist + ']*$';
return str.replace( new RegExp( pattern ) , '$1' )
}
document.getElementById( 'run' ).onclick = function() {
document.getElementById( 'result' ).value =
trim( document.getElementById( 'input' ).value,
document.getElementById( 'charlist' ).value);
}
<div>
<label for="input">Text to trim:</label><br>
<input id="input" type="text" placeholder="Text to trim" value="dfstextfsd"><br>
<label for="charlist">Charlist:</label><br>
<input id="charlist" type="text" placeholder="Charlist" value="dfs"><br>
<label for="result">Result:</label><br>
<input id="result" type="text" placeholder="Result" disabled><br>
<button type="button" id="run">Trim it!</button>
</div>
추신 : 대부분의 사람들이 이전에 이미 답변을했는데 왜 제가 답변을 게시 했습니까? 모든 답변에서 "가장 좋은"실수를 발견했기 때문에 모두 '*'대신 '+'메타를 사용했습니다. ' trim
시작 및 / 또는 끝에 있으면 문자를 제거해야하지만 그렇지 않으면 원래 문자열을 반환합니다. .
@ Pho3niX83의 솔루션이 마음에 듭니다 ...
"char"대신 "word"로 확장 해 봅시다 ...
function trimWord(_string, _word) {
var splitted = _string.split(_word);
while (splitted.length && splitted[0] === "") {
splitted.shift();
}
while (splitted.length && splitted[splitted.length - 1] === "") {
splitted.pop();
}
return splitted.join(_word);
};
"|Howdy".replace(new RegExp("^\\|"),"");
( 문자열\\
에 실제로 단일 슬래시를 사용 하려면 이중 이스케이프가 필요합니다 . 그러면 regExp 에서 이스케이프 됩니다.)|
regExp-Escaping이 필요한 문자는 거의 없습니다. , 그중 파이프 연산자.
String.prototype.TrimStart = function (n) {
if (this.charAt(0) == n)
return this.substr(1);
};
String.prototype.TrimEnd = function (n) {
if (this.slice(-1) == n)
return this.slice(0, -1);
};