Javascript 正则表达式在花括号之间获取字符串

Javascript 正则表达式在花括号之间获取字符串,javascript,regex,Javascript,Regex,不幸的是,尽管我在记忆中一年至少学习一次正则表达式,但我总是忘记,因为我很少使用它们。今年我的新年决心是不再尝试学习正则表达式,所以今年为了不让我流泪,我将把它送给Stack Overflow。(去年圣诞节混音) 我想以这种格式传入一个字符串{getThis},然后返回字符串getThis。谁能帮我坚持我的新年决心 有关堆栈溢出的相关问题: 试试看 /{(.*?)}/ 这意味着,匹配{和}之间的任何字符,但不要贪婪-匹配以}结尾的最短字符串(停止*贪婪)。括号用于提取匹配的部分 另一

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

我想以这种格式传入一个字符串
{getThis}
,然后返回字符串
getThis
。谁能帮我坚持我的新年决心


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

试试看

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

另一种方法是

/{([^}]*)}/

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

如果字符串始终采用该格式,则正则表达式是多余的:

>>> var g='{getThis}';
>>> g.substring(1,g.length-1)
"getThis"
子字符串(1
意味着开始一个字符(刚好超过第一个
{
)和
,g.length-1)
意味着获取字符,直到(但不包括)字符串长度减去一的字符。这是有效的,因为位置是基于零的,即
g.length-1
是最后一个位置

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

  • /
    :启动regex模式
    • {
      :一个字面值的大括号
      • :开始捕获
        • [
          :开始定义要捕获的字符类
          • ^}
            :“除
            }
            以外的任何内容”
        • ]
          :好的,这就是我们的整个类定义
        • *
          :与我们刚才定义的类匹配的任意数量的字符
      • :捕获完成
    • }
      :文字上的大括号必须紧跟在我们捕获的内容之后
  • /
    :结束正则表达式模式

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

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

选择器{。
.
这里有火柴
包括空白。
.
.}

如果您希望能够进一步返回内容,请将其全部用一组括号括起来,如下所示:

\{((\s*?.*?)*?)\}
您还可以通过1美元访问内容


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

您想使用regex lookahead和lookahead。这将只提供花括号内的内容:

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

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

var st = '{getThis}';

st = st.replace(/\{|\}/gi,''); // "getThis"
正如上面公认的答案所指出的,使用子字符串很容易解决原始问题,但是使用replace可以解决更复杂的用例

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

var nameAttr = "randomstring999[fieldname]";

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

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

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

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

试试这个,因为它对jsnormaly有效

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

试试这个:

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

欢迎来到由#{gskinner.com},#{ssd.sd}主持的RegExr v2.1,由Media Temple托管!

将返回
gskinner.com
ssd.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}

例如:

#包括
#包括
#包括
使用名称空间std;
int main()
{ 
//要搜索的字符串
字符串s=“{'day':1,'count':100},{'day':2,'count':100}”;
//要搜索的模式的正则表达式
正则表达式e(“\\{[a-z':,0-9]+\}”);
regex_令牌_迭代器rend;
正则表达式标记迭代器a(s.begin(),s.end(),e);

而(a!=rend)cout这一个匹配所有内容,即使它在中间发现多个右大括号:

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

例如:

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

子字符串是根据您所使用的语言而变化的内容之一。Javascript采用要停止的索引,PHP采用所需最终结果的长度(除非是负数,在这种情况下需要删除的字符数),C#又不同了……很好,很混乱……Python只是有切片,我觉得它比其他任何东西都好:p.Sweet,但不确定这是一个正则表达式。也许他问的是正则表达式,我来这里是为了同样的答案。遗憾的是,答案与问题无关。@baash05,如果你读了整个问题,OP di我甚至不想学习正则表达式,所以我不认为这是你所建议的学术练习。我想做-1因为问题是问正则表达式,我在搜索正则表达式,但被接受的答案对我来说完全没有用(而问题本身似乎很有希望)读了第一条评论后,我必须承认,如果我先回答这个问题,我本可以用同样/类似的方式回答…所以最后,+1.应该有一个反斜杠
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}] [{'day': 2, 'count': 100}]
{
  "foo": {
    "bar": 1,
    "baz": 1,
  }
}