En supposant:
var someStr = 'He said "Hello, my name is Foo"';
console.log(someStr.replace(/['"]+/g, ''));
Cela devrait faire l'affaire ... (si votre objectif est de remplacer tous les guillemets doubles).
Voici comment ça fonctionne:
['"]
est une classe de caractères, correspond à des guillemets simples et doubles. vous pouvez le remplacer par "
pour ne faire correspondre que les guillemets doubles.
+
: une ou plusieurs guillemets, caractères, tels que définis par la classe char précédente (facultatif)
g
: le drapeau mondial . Cela indique à JS d'appliquer l'expression régulière à la chaîne entière. Si vous omettez cela, vous ne remplacerez qu'un seul caractère.
Si vous essayez de supprimer les guillemets autour d'une chaîne donnée (c'est-à-dire par paires), les choses deviennent un peu plus compliquées. Vous devrez utiliser des assertions de contournement:
var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove foo delimiting quotes
str = 'remove only "foo" delimiting "';//note trailing " at the end
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove only foo delimiting "<-- trailing double quote is not removed
Regex a expliqué:
"
: littéral, correspond à n'importe quel littéral "
(
: commencez à capturer le groupe. Tout ce qui est entre les parenthèses ( ()
) sera capturé et pourra être utilisé dans la valeur de remplacement.
[^"]+
: Classe de personnage, correspond à tous les caractères, sauf "
1 ou plusieurs fois
(?=")
: assertion d'anticipation positive de largeur nulle (comme dans non capturée). Le match précédent ne sera valide que s'il est suivi d'un "
littéral
)
: fin du groupe de capture, nous avons tout capturé entre la fermeture d'ouverture "
"
: un autre littéral, cf élément de liste un
Le remplacement est '$1'
, c'est une référence arrière au premier groupe capturé, étant [^" ]+
, ou tout entre les guillemets doubles. Le modèle correspond à la fois aux guillemets et à ce qui se trouve entre eux, mais le remplace uniquement par ce qui se trouve entre les guillemets, les supprimant ainsi efficacement.
Ce qu'il fait est some "string with" quotes
-> remplace "string with"
par -> string with
. Les citations ont disparu, le travail est fait.
Si les guillemets doivent toujours être au début et à la fin de la chaîne, vous pouvez utiliser ceci:
str.replace(/^"(.+(?="$))"$/, '$1');
Avec l'entrée remove "foo" delimiting "
, la sortie restera inchangée, mais changez la chaîne d'entrée en "remove "foo" delimiting quotes"
, et vous vous retrouverez avec remove "foo" delimiting quotes
comme sortie.
Explication:
^"
: correspond au début de la chaîne ^
et a "
. Si la chaîne ne commence pas par un "
, l'expression échoue déjà ici et rien n'est remplacé.
(.+(?="$))
: correspond (et capture) tout, y compris les guillemets doubles une ou plusieurs fois, à condition que l'anticipation positive soit vraie
(?="$)
: le lookahead positif est à peu près le même que ci-dessus, seulement il spécifie que le "
doit être la fin de la chaîne ( $
=== end)
"$
: correspond à cette citation de fin, mais ne la capture pas
Le remplacement se fait de la même manière qu'avant: nous remplaçons la correspondance (qui comprend les guillemets d'ouverture et de fermeture), avec tout ce qui était à l'intérieur.
Vous avez peut-être remarqué que j'ai omis l' g
indicateur (pour le BTW global), car puisque nous traitons la chaîne entière, cette expression ne s'applique qu'une seule fois.
Une expression rationnelle plus facile qui fait à peu près la même chose (il existe une différence interne de la façon dont la expression rationnelle est compilée / appliquée) serait:
someStr.replace(/^"(.+)"$/,'$1');
Comme précédemment ^"
et "$
faites correspondre les guillemets de délimitation au début et à la fin d'une chaîne, et le fait (.+)
correspondre tout le reste et le capture. J'ai essayé cette expression régulière, à côté de celle ci-dessus (avec assertion de lookahead) et, certes, à ma surprise, j'ai trouvé que celle-ci était légèrement plus lente. Je suppose que l'assertion de la recherche entraîne l'échec de l'expression précédente dès que le moteur détermine qu'il n'y en a pas "
à la fin de la chaîne. Ah bien, mais si c'est ce que vous voulez / avez besoin, veuillez lire :
Cependant, dans ce dernier cas, c'est beaucoup plus sûr, plus rapide, plus facile à entretenir et tout simplement mieux de le faire:
if (str.charAt(0) === '"' && str.charAt(str.length -1) === '"')
{
console.log(str.substr(1,str.length -2));
}
Ici, je vérifie si le premier et le dernier caractère de la chaîne sont des guillemets doubles. S'ils le sont, j'utilise substr
pour couper ces premier et dernier caractères. Les chaînes sont indexées à zéro, donc le dernier caractère est le charAt(str.length -1)
. substr
attend 2 arguments, où le premier est le décalage à partir duquel la sous-chaîne démarre, le second est sa longueur. Puisque nous ne voulons pas du dernier caractère, pas plus que nous ne voulons du premier, cette longueur est str.length - 2
. Facile-peazy.
Astuces :
Plus d'informations sur les assertions peuvent être trouvées ici Les
Regex sont très utiles (et amusantes à l'OMI), peuvent être un peu déroutantes au début. Voici quelques détails supplémentaires et des liens vers des ressources sur le sujet.
Si vous n'êtes pas encore très à l'aise avec les expressions régulières, vous voudrez peut-être envisager d'utiliser:
var noQuotes = someStr.split('"').join('');
S'il y a beaucoup de guillemets dans la chaîne, cela pourrait même être plus rapide que d'utiliser l'expression régulière