web-dev-qa-db-fra.com

Comment supprimer un caractère spécifique entourant une chaîne?

J'ai cette ficelle:

var str = "? this is a ? test ?";

Maintenant je veux avoir ceci:

var newstr = "this is a ? test";

Comme vous le voyez, je souhaite supprimer uniquement les ? entourant (au début et à la fin)} cette chaîne (pas au milieu de la chaîne)}. Comment faire cela en utilisant JavaScript?

Voici ce que j'ai essayé:

var str = "? this is a ? test ?";
var result = str.trim("?");
document.write(result);

Donc, comme vous le voyez, cela ne fonctionne pas. En fait, je suis un développeur PHP et trim() fonctionne bien dans PHP . Maintenant, je veux savoir si je peux utiliser trim() pour le faire dans JS.


Il convient de noter je peux le faire en utilisant regex , mais pour être honnête, je déteste regex pour ce type de travail. Quoi qu'il en soit, y a-t-il une meilleure solution?


Edit: Comme cela est mentionné dans le commentaire, je dois supprimer à la fois ? et les espaces blancs qui entourent la chaîne.

11
Shafizadeh

Rechercher un masque de caractère et renvoyer le reste sans.

Cette proposition concerne l'utilisation de l'opérateur bitwise not~ pour la vérification.

~ est un bitwise not operator . Il est parfait pour une utilisation avec indexOf() , parce que indexOf renvoie si trouvé l’index 0 ... n et sinon -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

Une solution possible consisterait à utiliser des fonctions récursives pour supprimer les caractères de début et de fin indésirables. Cela n'utilise pas d'expressions régulières.

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;
    }
}

Bien sûr, ce n’est qu’une des nombreuses solutions possibles. La fonction trim utiliserait à la fois ltrim et rtrim.

La raison pour laquelle char est le premier argument et la chaîne qui doit être nettoyée le second, est pour faciliter sa modification en une fonction de style de programmation fonctionnelle, comme suit (ES 2015):

function ltrim(char) {
    (str) => {
        <body of function>
    }
}

// No need to specify str here
function ltrimSpaces = ltrim(' ');
6
Arjan

Utilisez simplement:

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

console.log(text)

4
Michal Karzel

Voici une façon de le faire qui vérifie les index-hors limites et n'appelle qu'un seul appel à substring:

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);
};

Exemple:

var str = "? this is a ? test ?";

str.trimChars(" ?");  // "this is a ? test"
3
ericman314

Approche simple utilisant les fonctions Array.indexOf, Array.lastIndexOf et Array.slice:

Mise à jour: (note: l'auteur a demandé de couper leentourantchars)

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

Pas de regex:

uberTrim = s => s.length >= 2 && (s[0] === s[s.length - 1])?
  s.slice(1, -1).trim() 
  : s;

Explication pas à pas:

  1. Vérifiez si la chaîne contient au moins 2 caractères et si elle est entourée d'un caractère spécifique.
  2. Si c'est le cas, découpez-le d'abord pour supprimer les caractères environnants, puis coupez-le pour supprimer les espaces;
  3. Si ce n'est pas juste le retourner.

Au cas où vous seriez dérangé par cette syntaxe, il s’agit d’un Fonction de flèche et d’un opérateur ternaire .
Les parenthèses sont superflues dans le ternaire en passant.

Exemple d'utilisation:

uberTrim(''); // ''
uberTrim(' Plop! '); //'Plop!'
uberTrim('! ...What is Plop?!'); //'...What is Plop?'
3
Paul Stenne

pour garder cette question à jour en utilisant une approche ES6:

J'ai bien aimé la méthode bitwise mais quand la lisibilité est aussi une préoccupation, voici une autre approche.

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.

La méthode de découpage de Javascript supprime uniquement les espaces et ne prend aucun paramètre. Pour un ajustement personnalisé, vous devrez créer votre propre fonction. Regex constituerait une solution rapide, et vous pouvez trouver une implémentation d'un trim personnalisé sur w3schools au cas où vous ne voudriez pas avoir le temps de suivre le processus de création d'une regex. (il vous suffira de l'ajuster pour filtrer? au lieu d'espaces

1
Bettorun

Utiliser regex

'? this is a ? test ?'.replace(/^[? ]*(.*?)[? ]*$/g, '$1')

Vous pouvez détester regex mais après avoir trouvé une solution, vous vous sentirez bien :)

0
Anupam Ghosh