正则表达式在花括号之间获取字符串“{我想在花括号之间有什么}}”

时间:2009-01-05 13:21:34

标签: javascript regex

不幸的是,尽管我一年中至少有一次尝试学习正则表达多年,但我总是忘记,因为我很少使用它们。今年我的新年决心是不再尝试再学习正则表达式 - 所以今年为了让我免于流泪,我会把它交给Stack Overflow 。 (去年圣诞节混音)。

我想以这种格式传递一个字符串{getThis},并返回字符串getThis。任何人都可以帮助坚持我的新年决议吗?


Stack Overflow的相关问题:

15 个答案:

答案 0 :(得分:235)

尝试

/{(.*?)}/

这意味着,匹配{和}之间的任何字符,但不要贪婪 - 匹配以}结尾的最短字符串(?停止*贪婪)。括号允许您提取匹配的部分。

另一种方式是

/{([^}]*)}/

这匹配除了} char之外的任何字符(另一种不贪婪的方式)

答案 1 :(得分:137)

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

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

答案 2 :(得分:37)

如果你的字符串总是那种格式,那么正则表达式就是矫枉过正:

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

答案 3 :(得分:21)

试试这个:

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

例如

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

将返回gskinner.comssd.sd

答案 4 :(得分:18)

这是一个使用javascript replace

的简单解决方案
var st = '{getThis}';

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

正如上面接受的答案指出原始问题很容易用子串解决,但使用replace可以解决更复杂的用例

如果你有一个像“randomstring999 [fieldname]”这样的字符串 您使用稍微不同的模式来获取fieldname

var nameAttr = "randomstring999[fieldname]";

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

答案 5 :(得分:14)

这个在Textmate中工作,它匹配大括号之间的CSS文件中的所有内容。

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

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

如果您想进一步返回内容,请将其全部包含在另外一组括号中,如下所示:

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

您可以通过$ 1访问内容。

这也适用于函数,但我没有使用嵌套的大括号进行测试。

答案 6 :(得分:10)

你想使用正则表达式前瞻和后瞻。这只会给你花括号内的内容:

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

答案 7 :(得分:5)

尝试一下

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

答案 8 :(得分:3)

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

如果正则表达式不匹配,则更简单的.replace(/.*{(.*)}.*/, '$1')会返回整个字符串。上面的代码段可以更轻松地检测匹配。

答案 9 :(得分:3)

尝试这个,根据http://www.regextester.com,它适用于 js 正常。

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

答案 10 :(得分:2)

用于获取括号括起来的字符串数组的正则表达式出现在字符串中,而不是仅查找第一次出现。

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

答案 11 :(得分:2)

我已经研究了其他答案,他们似乎缺少一个至关重要的逻辑。即,选择两个CONSECUTIVE括号之间的所有内容,但不选择括号

所以,这是我的回答

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

答案 12 :(得分:1)

您可以使用此正则表达式递归来匹配其间的所有内容,甚至是另一个{}(如JSON文本):

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

答案 13 :(得分:1)

即使这对尝试解决某人的问题有帮助,

将内容拆分成大括号({}),其格式如下: {'day': 1, 'count': 100}

例如:

#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; 
}

输出:

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

答案 14 :(得分:0)

即使在中间找到多个右花括号,这个也匹配所有内容:

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

示例:

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