ChrisInCambo
ChrisInCambo

Reputation: 8795

Regex to get string between curly braces

Unfortunately, despite having tried to learn regex at least one time a year for as many years as I can remember, I always forget as I use them so infrequently. This year my new year's resolution is to not try and learn regex again - So this year to save me from tears I'll give it to Stack Overflow. (Last Christmas remix).

I want to pass in a string in this format {getThis}, and be returned the string getThis. Could anyone be of assistance in helping to stick to my new year's resolution?


Related questions on Stack Overflow:

Upvotes: 159

Views: 362874

Answers (17)

RARE Kpop Manifesto
RARE Kpop Manifesto

Reputation: 2915

echo '/{id}/{name}/{age}' |
mawk NF=NF FS='(^|[}]+)(/[{]+|$)' OFS='\v'
id
  name
      age

You can extract them out just as easily with the most bland flavor of ERE

Upvotes: 0

Hemadri Dasari
Hemadri Dasari

Reputation: 34014

Try this

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

Upvotes: 29

Afzal Ali
Afzal Ali

Reputation: 1066

Your can use String.slice() method.

let str = "{something}";
str = str.slice(1,-1) // something

Upvotes: -1

Renato
Renato

Reputation: 441

This one matches everything even if it finds multiple closing curly braces in the middle:

\{([\s\S]*)\}

Example:

{
  "foo": {
    "bar": 1,
    "baz": 1,
  }
}

Upvotes: 6

Shudipta Sharma
Shudipta Sharma

Reputation: 5882

Even this helps me while trying to solve someone's problem,

Split the contents inside curly braces ({}) having a pattern like, {'day': 1, 'count': 100}.

For example:

#include <iostream> 
#include <regex> 
#include<string> 
using namespace std; 

int main() 
{ 
    //string to be searched
    string s = "{'day': 1, 'count': 100}, {'day': 2, 'count': 100}";

    // regex expression for pattern to be searched 
    regex e ("\\{[a-z':, 0-9]+\\}");
    regex_token_iterator<string::iterator> rend;

    regex_token_iterator<string::iterator> a ( s.begin(), s.end(), e );
    while (a!=rend) cout << " [" << *a++ << "]";
    cout << endl;

    return 0; 
}

Output:

[{'day': 1, 'count': 100}] [{'day': 2, 'count': 100}]

Upvotes: 2

Kev
Kev

Reputation: 16341

If your string will always be of that format, a regex is overkill:

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

substring(1 means to start one character in (just past the first {) and ,g.length-1) means to take characters until (but not including) the character at the string length minus one. This works because the position is zero-based, i.e. g.length-1 is the last position.

For readers other than the original poster: If it has to be a regex, use /{([^}]*)}/ if you want to allow empty strings, or /{([^}]+)}/ if you want to only match when there is at least one character between the curly braces. Breakdown:

  • /: start the regex pattern
    • {: a literal curly brace
      • (: start capturing
        • [: start defining a class of characters to capture
          • ^}: "anything other than }"
        • ]: OK, that's our whole class definition
        • *: any number of characters matching that class we just defined
      • ): done capturing
    • }: a literal curly brace must immediately follow what we captured
  • /: end the regex pattern

Upvotes: 67

chim
chim

Reputation: 8573

Here's a simple solution using javascript replace

var st = '{getThis}';

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

As the accepted answer above points out the original problem is easily solved with substring, but using replace can solve the more complicated use cases

If you have a string like "randomstring999[fieldname]" You use a slightly different pattern to get fieldname

var nameAttr = "randomstring999[fieldname]";

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

Upvotes: 24

p3quod
p3quod

Reputation: 1679

You can use this regex recursion to match everythin between, even another {} (like a JSON text) :

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

Upvotes: 2

souparno majumder
souparno majumder

Reputation: 2052

i have looked into the other answers, and a vital logic seems to be missing from them . ie, select everything between two CONSECUTIVE brackets,but NOT the brackets

so, here is my answer

\{([^{}]+)\}

Upvotes: 9

Mohamed Abo Elmagd
Mohamed Abo Elmagd

Reputation: 1137

Try this:

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

For example

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

will return gskinner.com, ssd.sd.

Upvotes: 53

Er. Mohit Agrawal
Er. Mohit Agrawal

Reputation: 2276

Regex for getting arrays of string with curly braces enclosed occurs in string, rather than just finding first occurrence.

 /\{([^}]+)\}/gm 

Upvotes: 6

Try this one, according to http://www.regextester.com it works for js normaly.

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

Upvotes: 4

Robert Cesaric
Robert Cesaric

Reputation: 203

You want to use regex lookahead and lookbehind. This will give you only what is inside the curly braces:

(?<=\{)(.*?)(?=\})

Upvotes: 17

Curtis Yallop
Curtis Yallop

Reputation: 7329

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

The simpler .replace(/.*{(.*)}.*/, '$1') unfortunately returns the entire string if the regex does not match. The above code snippet can more easily detect a match.

Upvotes: 4

meouw
meouw

Reputation: 42140

/\{([^}]+)\}/

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

Upvotes: 166

Alex Kessaris
Alex Kessaris

Reputation: 189

This one works in Textmate and it matches everything in a CSS file between the curly brackets.

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

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

If you want to further be able to return the content, then wrap it all in one more set of parentheses like so:

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

and you can access the contents via $1.

This also works for functions, but I haven't tested it with nested curly brackets.

Upvotes: 18

Paul Dixon
Paul Dixon

Reputation: 301115

Try

/{(.*?)}/

That means, match any character between { and }, but don't be greedy - match the shortest string which ends with } (the ? stops * being greedy). The parentheses let you extract the matched portion.

Another way would be

/{([^}]*)}/

This matches any character except a } char (another way of not being greedy)

Upvotes: 289

Related Questions