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é:
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"
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)
/\{([^}]+)\}/
/ - 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
Essaye ça:
/[^{\}]+(?=})/g
Par exemple
Welcome to RegExr v2.1 by #{gskinner.com}, #{ssd.sd} hosted by Media Temple!
retournera gskinner.com
, ssd.sd
.
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"
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.
Vous voulez utiliser les expressions régulières avant et après. Cela vous donnera seulement ce qui est à l'intérieur des accolades:
(?<=\{)(.*?)(?=\})
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"]
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.
Vous pouvez utiliser cette récursion regex pour faire correspondre tout, même un autre {}
(Comme un texte JSON):
\{([^()]|())*\}
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
\{([^{}]+)\}
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