正则表达式来得到大括号之间的字符串“{我想要大括号之间}”

不幸的是,尽管我至少每年都要学习一次正则表达式,但我经常忘记,因为我很少使用它。 今年我的新年的决心是不要再尝试和学习正则表达式 – 所以今年,为了不让我流泪,我会给它堆栈溢出 。 (去年圣诞节重新混音)

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


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

  • 如何将正则引号(即“,”)转换成LaTeX / TeX引号(即“,“`')
  • 正则表达式:拉出一个字符串中两个标签之间的一个子字符串
  • 正则表达式来替换一个字符串中的所有\ n,但是没有那些[code] [/ code]标签里面的那些

如果你的字符串总是这样的格式,正则表达式是矫枉过正的:

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

尝试

 /{(.*?)}/ 

这意味着,匹配{和}之间的任何字符,但不要贪婪 – 匹配以}结尾的最短字符串(“停止”*为贪婪)。 圆括号让你提取匹配的部分。

另一种方法是

 /{([^}]*)}/ 

这匹配除了一个字符(另一种不贪婪的方式)

 /\{([^}]+)\}/ / - 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*?.*?)*?\} 

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

如果你想进一步能够返回内容,那么把它们全部包装在一个括号中,如下所示:

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

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

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

这是一个简单的解决方案,使用JavaScript替换

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

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

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

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

你想要使用正则表达式和lookbehead。 这只会给你大括号里面的东西:

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

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

试试这个,根据http://www.regextester.com它适用&#x4E8E;js normaly。

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

尝试这个:

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

例如

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

将返回gskinner.comssd.sd

使用正则表达式来获取包含花括号的字符串数组,而不是仅仅查找第一个匹配项。

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

我已经研究了其他的答案,并且似乎从他们身上丢失了一个重要的逻辑。 即选择两个括号之间的所有内容,而不是括号

所以,这是我的答案

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

你可以使用这个regex递归匹配everythin,甚至是另一个{} (比如JSON文本):

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