Ich habe diese Zeichenfolge:
var str = "? this is a ? test ?";
Jetzt möchte ich das bekommen:
var newstr = "this is a ? test";
Wie Sie sehen, möchte ich nur die ?
-Zeichen entfernen, die (am Anfang und Ende) diese Zeichenfolge (nicht in der Mitte der Zeichenfolge)} enthalten. Wie geht das mit JavaScript?
Folgendes habe ich ausprobiert:
var str = "? this is a ? test ?";
var result = str.trim("?");
document.write(result);
Wie Sie sehen, funktioniert es also nicht. Eigentlich bin ich ein PHP Entwickler und trim()
funktioniert gut in PHP . Jetzt möchte ich wissen, ob ich trim()
dazu in JS verwenden kann.
Es sollte beachtet werden ich kann das mit Regex tun , aber ehrlich gesagt hasse ich Regex für diese Art von Jobs. Gibt es sowieso eine bessere Lösung?
Edit: Wie bereits erwähnt, muss ich sowohl ?
als auch Leerzeichen entfernen, die sich um den String befinden.
Suchen Sie nach der Zeichenmaske und geben Sie den Rest ohne zurück.
In diesem Vorschlag wird der Operator bitwise not~
zur Überprüfung verwendet.
~
ist ein bitweiser nicht Operator . Es ist perfekt für die Verwendung mitindexOf()
, daindexOf
zurückgegeben wird, wenn der Index0 ... n
gefunden wird und falls nicht-1
:value ~value boolean -1 => 0 => false 0 => -1 => true 1 => -2 => true 2 => -3 => true and so on
function trim(s, mask) {
while (~mask.indexOf(s[0])) {
s = s.slice(1);
}
while (~mask.indexOf(s[s.length - 1])) {
s = s.slice(0, -1);
}
return s;
}
console.log(trim('??? this is a ? test ?', '? '));
console.log(trim('abc this is a ? test abc', 'cba '));
Eine mögliche Lösung wäre, rekursive Funktionen zu verwenden, um die unerwünschten führenden und nachfolgenden Zeichen zu entfernen. Dies verwendet keine regulären Ausdrücke.
function ltrim(char, str) {
if (str.slice(0, char.length) === char) {
return ltrim(char, str.slice(char.length));
} else {
return str;
}
}
function rtrim(char, str) {
if (str.slice(str.length - char.length) === char) {
return rtrim(char, str.slice(0, 0 - char.length));
} else {
return str;
}
}
Natürlich ist dies nur eine von vielen möglichen Lösungen. Die Funktion trim
würde sowohl ltrim
als auch rtrim
verwenden.
Der Grund, dass char
das erste Argument ist, und die Zeichenfolge, die im zweiten gereinigt werden muss, besteht darin, es einfacher zu machen, dies in eine funktionale Programmierstil-Funktion umzuwandeln (ES 2015):
function ltrim(char) {
(str) => {
<body of function>
}
}
// No need to specify str here
function ltrimSpaces = ltrim(' ');
Verwenden Sie einfach:
let text = '?? something ? really ??'
text = text.replace(/^([?]*)/g, '')
text = text.replace(/([?]*)$/g, '')
console.log(text)
Dies ist eine Möglichkeit, die nach Index-Out-of-Bounds sucht und substring
nur einmal anruft:
String.prototype.trimChars = function(chars) {
var l = 0;
var r = this.length-1;
while(chars.indexOf(this[l]) >= 0 && l < r) l++;
while(chars.indexOf(this[r]) >= 0 && r >= l) r--;
return this.substring(l, r+1);
};
Beispiel:
var str = "? this is a ? test ?";
str.trimChars(" ?"); // "this is a ? test"
Einfacher Ansatz mit den Funktionen Array.indexOf
, Array.lastIndexOf
und Array.slice
:
Update: (Hinweis: Der Autor hat angefordert, dieumgebenden-Carre zu trimmen)
function trimChars(str, char){
var str = str.trim();
var checkCharCount = function(side) {
var inner_str = (side == "left")? str : str.split("").reverse().join(""),
count = 0;
for (var i = 0, len = inner_str.length; i < len; i++) {
if (inner_str[i] !== char) {
break;
}
count++;
}
return (side == "left")? count : (-count - 1);
};
if (typeof char === "string"
&& str.indexOf(char) === 0
&& str.lastIndexOf(char, -1) === 0) {
str = str.slice(checkCharCount("left"), checkCharCount("right")).trim();
}
return str;
}
var str = "???? this is a ? test ??????";
console.log(trimChars(str, "?")); // "this is a ? test"
Kein Regex:
uberTrim = s => s.length >= 2 && (s[0] === s[s.length - 1])?
s.slice(1, -1).trim()
: s;
Schritt für Schritt Erklärung:
Falls Sie von dieser Syntax abgelenkt werden, handelt es sich um eine Arrow-Funktion und einen ternären Operator .
Die Klammern sind im Übrigen übrigens überflüssig.
Anwendungsbeispiel:
uberTrim(''); // ''
uberTrim(' Plop! '); //'Plop!'
uberTrim('! ...What is Plop?!'); //'...What is Plop?'
um diese Frage mit einem ES6-Ansatz auf dem neuesten Stand zu halten:
Ich mochte die bitweise Methode, aber auch wenn Lesbarkeit ein Problem ist, gibt es hier einen anderen Ansatz.
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);
}
Die Trimmmethode von Javascript entfernt nur Leerzeichen und nimmt keine Parameter an. Für eine individuelle Anpassung müssen Sie Ihre eigene Funktion erstellen. Regex würde eine schnelle Lösung dafür finden, und Sie können eine Implementierung eines benutzerdefinierten Abschnitts in w3schools finden, falls Sie nicht die Mühe haben möchten, den Regex-Erstellungsprozess zu durchlaufen. (Sie müssten es einfach filtern? statt Whitespace)
Regex verwenden
'? this is a ? test ?'.replace(/^[? ]*(.*?)[? ]*$/g, '$1')
Sie mögen Regex hassen, aber nachdem Sie eine Lösung gefunden haben, werden Sie sich cool fühlen :)