134 votes

Regex pour obtenir une chaîne entre accolades "{Je veux ce qui est entre les accolades}"

Malheureusement, malgré avoir essayé d'apprendre regex au moins une fois par an pour que de nombreuses années que je me souvienne, j'oublie toujours que je les utilise très rarement. Cette année, ma résolution du nouvel an est de ne pas essayer et d'apprendre les regex nouveau - Alors cette année, pour me sauver de larmes je vais le donner à un Débordement de Pile. (Noël dernier remix).

Je veux passer dans une chaîne de caractères dans ce format {getThis}, et être retourné à la chaîne getThis. N'importe qui pourrait être utile pour aider à tenir à ma résolution de nouvelle année?


Questions sur Stack Overflow:

265voto

Paul Dixon Points 122033

Essayer

 /{(.*?)}/
 

Cela signifie que vous devez faire correspondre n'importe quel caractère compris entre {et}, mais ne soyez pas gourmand - faites correspondre la chaîne la plus courte qui se termine par} (le? Cesse * d'être glouton). Les parenthèses vous permettent d'extraire la partie correspondante.

Une autre façon serait

 /{([^}]*)}/
 

Cela correspond à n'importe quel caractère sauf un caractère (une autre façon de ne pas être gourmand)

154voto

meouw Points 21368
/\{([^}]+)\}/

/        - delimiter
\{       - opening literal brace escaped because it is a special character used for quantifiers eg {2,3}
(        - start capturing
[^}]     - character class consisting of
    ^    - not
    }    - a closing brace (no escaping necessary because special characters in a character class are different)
+        - one or more of the character class
)        - end capturing
\}       - the closing literal brace
/        - delimiter

63voto

Kev Points 5046

Si votre chaîne sera toujours de ce format, une expression régulière est overkill:

 >>> var g='{getThis}';
>>> g.substring(1,g.length-1)
"getThis"
 

21voto

chim Points 1799

Voici une solution simple en utilisant javascript replace

 var st = '{getThis}';

st = st.replace(/\{|\}/gi,''); // "getThis"
 

Comme le souligne la réponse acceptée ci-dessus, le problème initial est facilement résolu avec une sous-chaîne, mais l'utilisation de remplacer peut résoudre les cas d'utilisation plus complexes.

Si vous avez une chaîne du type "randomstring999 [nom du champ]", vous utilisez un modèle légèrement différent pour obtenir le nom du champ.

 var nameAttr = "randomstring999[fieldname]";

justName = nameAttr.replace(/.*\[|\]/gi,''); // "fieldname"
 

17voto

Alex Kessaris Points 71

Celui-ci fonctionne dans Textmate et il fait correspondre tout ce qui se trouve dans un fichier CSS entre les accolades.

 \{(\s*?.*?)*?\}
 

selector {. . matches here including white space. . .}

Si vous voulez pouvoir encore renvoyer le contenu, placez-le dans un jeu de parenthèses supplémentaire, comme suit:

 \{((\s*?.*?)*?)\}
 

et vous pouvez accéder au contenu via 1 $.

Cela fonctionne également pour les fonctions, mais je ne l'ai pas testé avec des accolades imbriquées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X