web-dev-qa-db-fra.com

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 pendant autant d'années que je me souvienne, j'oublie toujours car je les utilise si peu fréquemment. Cette année, ma résolution du nouvel an est de ne pas essayer d’apprendre la regex - . Alors cette année, pour me sauver des larmes, je le donnerai à Stack Overflow . (Dernier remix de Noël).

Je veux passer une chaîne dans ce format {getThis}, et que la chaîne getThis soit renvoyée. Quelqu'un pourrait-il m'aider à rester fidèle à la résolution de mon nouvel an?


Questions connexes sur le dépassement de capacité:

101
ChrisInCambo

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"
36
Kev

Essayer

/{(.*?)}/

Cela signifie que vous devez faire correspondre n'importe quel caractère entre {et}, mais ne soyez pas gourmand - faites correspondre la chaîne la plus courte qui se termine par} (le? Cesse * étant 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)

237
Paul Dixon
/\{([^}]+)\}/

/        - 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
143
meouw

Essaye ça:

/[^{\}]+(?=})/g

Par exemple

Welcome to RegExr v2.1 by #{gskinner.com},  #{ssd.sd} hosted by Media Temple!

retournera gskinner.com, ssd.sd.

22

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]";

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

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 retourner 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.

14
Alex Kessaris

Vous voulez utiliser les expressions régulières avant et après. Cela vous donnera seulement ce qui est à l'intérieur des accolades:

(?<=\{)(.*?)(?=\})
11
Robert Cesaric

Essaye ça

let path = "/{id}/{name}/{age}";
const paramsPattern = /[^{\}]+(?=})/g;
let extractParams = path.match(paramsPattern);
console.log("extractParams", extractParams) // prints all the names between {} = ["id", "name", "age"]
5
Hemadri Dasari

Essayez celui-ci, selon http://www.regextester.com cela fonctionne normalement pour js .

([^{]*?)(?=\})

var re = /{(.*)}/;
var m = "{helloworld}".match(re);
if (m != null)
    console.log(m[0].replace(re, '$1'));

Le plus simple .replace(/.*{(.*)}.*/, '$1') renvoie malheureusement la chaîne entière si l'expression régulière ne correspond pas. L'extrait de code ci-dessus peut plus facilement détecter une correspondance.

3
Curtis Yallop

Vous pouvez utiliser cette récursion regex pour faire correspondre tout, même un autre {} (Comme un texte JSON):

\{([^()]|())*\}
2
p3quod

j'ai examiné les autres réponses et une logique vitale semble leur manquer. c.-à-d., sélectionnez tout entre deux crochets CONSÉCUTIFS, mais PAS les crochets

alors voici ma réponse

\{([^{}]+)\}
2
souparno majumder

Les expressions rationnelles pour obtenir des tableaux de chaîne avec des accolades entourées se produisent dans chaîne, plutôt que de simplement rechercher la première occurrence.

 /\{([^}]+)\}/gm 
2
Er. Mohit Agrawal