जवाबों:
एक पंक्ति पर्याप्त है:
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, '#//'));
यदि आप लंबे समय तक तार के साथ काम कर रहे हैं, तो मेरा मानना है कि यह या तो या तो आवंटित तार की संख्या को कम करके अन्य विकल्पों में से बेहतर प्रदर्शन करना चाहिए:
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 के पास एक फंक्शन नहीं है, जो आपके बारे में पूछ रहा है। हालांकि जावास्क्रिप्ट के साथ, आप अपनी स्ट्रिंग की सामग्री को बदलने के लिए प्रतिस्थापित का उपयोग कर सकते हैं:
x.replace(/|/i, ""));
यह सभी घटनाओं को प्रतिस्थापित करेगा | किसी के साथ नहीं।
$
इस तरह से केवल अंत में फेंक दें : "||spam|||".replace(/\|+$/g, "")
या ^
इस तरह से केवल शुरुआत के लिए:"||spam|||".replace(/^\|+/g, "")
यह सभी प्रमुख और अनुगामी delimeters को ट्रिम करता है
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
मैं सुझाव दूंगा कि वे लॉश को कैसे देखते हैं और उन्होंने किस तरह से trim
कार्य को कार्यान्वित किया है।
प्रलेखन और स्रोत के लिए लोदश ट्रिम देखें सटीक कोड है कि trimming करता है देखने के लिए।
मुझे पता है कि यह आपके प्रश्न का सटीक उत्तर प्रदान नहीं करता है, लेकिन मुझे लगता है कि इस तरह के प्रश्न पर लाइब्रेरी का संदर्भ सेट करना अच्छा है क्योंकि अन्य इसे उपयोगी पा सकते हैं।
इस कार्य को हल करने का सबसे अच्छा तरीका है (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
को चार्ट को हटाना होगा यदि वे START और / या अंत में हैं, लेकिन यह किसी अन्य मामले में मूल स्ट्रिंग लौटाता है ।
मुझे @ Pho3niX83 से समाधान पसंद है ...
आइए इसे "चार" के बजाय "शब्द" से विस्तारित करें ...
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);
};
function trim(text, val) {
return text.replace(new RegExp('^'+val+'+|'+val+'+$','g'), '');
}
"|Howdy".replace(new RegExp("^\\|"),"");
(ध्यान दें कि डबल भागने की \\
जरूरत है । स्ट्रिंग में वास्तव में एक ही स्लैश है , जो फिर regExx|
में भागने की ओर जाता है )।
केवल कुछ ही अक्षरों को regExp-भागने की आवश्यकता होती है। , उनमें से पाइप ऑपरेटर।
प्रयत्न:
console.log(x.replace(/\|/g,''));
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);
};
इस विधि का प्रयास करें:
var a = "anan güzel mi?";
if (a.endsWith("?")) a = a.slice(0, -1);
document.body.innerHTML = a;