web-dev-qa-db-ger.com

Wie entferne ich bestimmte Zeichen, die eine Zeichenkette umgeben?

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.

11
Shafizadeh

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 mit indexOf() , da indexOf zurückgegeben wird, wenn der Index 0 ... 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 '));

11
Nina Scholz

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(' ');
6
Arjan

Verwenden Sie einfach:

let text = '?? something ? really ??'
text = text.replace(/^([?]*)/g, '')
text = text.replace(/([?]*)$/g, '')

console.log(text)

4
Michal Karzel

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"
3
ericman314

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"
3
RomanPerekhrest

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:

  1. Prüfen Sie, ob die Zeichenfolge mindestens 2 Zeichen lang ist und von einem bestimmten Zeichen umgeben ist.
  2. Wenn dies der Fall ist, schneiden Sie es zuerst, um die umgebenden Zeichen zu entfernen, und schneiden Sie es dann ab, um Leerzeichen zu entfernen.
  3. Wenn Sie es nicht zurückgeben.

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?'
3
Paul Stenne

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);
}
2
Robin F.

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)

1
Bettorun

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 :)

0
Anupam Ghosh