正则表达式获取大括号之间的字符串

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

我希望传入一个格式为 {getThis}的字符串,然后返回字符串 getThis。有谁能帮助我坚持我的新年决心吗?


关于堆栈溢出的相关问题:

319023 次浏览

试试看

/{(.*?)}/

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

另一种方法是

/{([^}]*)}/

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

如果您的字符串总是采用这种格式,那么正则表达式就有点过分了:

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

substring(1表示在(刚过第一个 {)中开始一个字符,而 ,g.length-1)表示在字符串长度减去一个字符之前(但不包括)接受字符。这是因为位置是从零开始的,也就是说,g.length-1是最后一个位置。

对于原始海报以外的读者: 如果 已经是正则表达式,如果想要允许空字符串,请使用 /{([^}]*)}/; 如果想要只匹配花括号之间至少有一个字符,请使用 /{([^}]+)}/。细目:

  • 启动正则表达式模式
    • 字面上的花括号
      • 开始捕捉
        • [: 开始定义要捕获的字符类
          • ^}: “除了 }以外的任何东西”
        • ]: 好的,这就是我们整个类的定义
        • *: 与我们刚刚定义的类相匹配的任意数量的字符
      • 捕捉完毕
    • }: 文字花括号必须紧跟我们捕获的内容
  • 结束正则表达式模式
/\{([^}]+)\}/


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

这个工作在 Textmate,它匹配在一个 CSS 文件中的所有东西之间的花括号。

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

选择器{。 . 火柴在这里 包括留白。 . .}

如果您希望进一步返回内容,那么将它们全部包装在一组括号中,如下所示:

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

您可以通过 $1进入内容。

这也适用于函数,但是我还没有用嵌套的花括号测试过。

你可以使用正则表达式前瞻和后瞻,这样只能得到大括号中的内容:

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

这里有一个使用 javascript 替换的简单解决方案

var st = '{getThis}';


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

正如上面已被接受的答案所指出的,原来的问题很容易用子串解决,但是使用替换可以解决更复杂的用例

如果您有一个字符串,比如“ Random string999[ fieldname ]” 使用稍微不同的模式获取字段名

var nameAttr = "randomstring999[fieldname]";


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

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

用于获取包含大括号的字符串数组的正则表达式发生在字符串中,而不仅仅是查找第一个匹配项。

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

试试这一个,根据 http://www.regextester.com它的工作 JS正常。

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

试试这个:

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

比如说

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

将返回 gskinner.comssd.sd

我研究了其他的答案,似乎缺少一个重要的逻辑。即,在两个连续的括号之间选择所有内容,但不要选择括号

这就是我的答案

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

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

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

试试这个

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

即使这样也能帮我解决别人的问题,

将花括号({})中的内容拆分, {'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}]

这个匹配所有内容,即使它在中间发现多个关闭的花括号:

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

例如:

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

您可以使用 String.slice ()方法。

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