不幸的是,尽管尽我所能记住,尝试过一年至少一年学习一次正则表达式,但我却经常忘记,因为我很少使用它们。今年,我新年的决心是不要再尝试学习正则表达式-因此,今年,为了让我免于眼泪,我将把它交给Stack Overflow。 (上次圣诞节混音)。

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


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


如何才能正常转身在LaTeX / TeX中用引号(即',')引号(即'',``'')
正则表达式:在字符串中两个标签之间拉出子字符串
正则表达式以替换所有\ n在字符串中,但在[code] [/ code]标记内没有那些


评论

此问题已添加到“高级Regex-Fu”下的“堆栈溢出正则表达式常见问题解答”中。

@Kobi:常见问题解答是一个Wiki。任何人都可以编辑它。所以编辑它。

#1 楼

如果您的字符串将始终采用这种格式,则正则表达式会显得过大:

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


substring(1表示以一个字符开头(刚好超过第一个{),而,g.length-1)表示接受字符直到(但不包括)字符串长度减去一的字符。之所以起作用,是因为该位置从零开始,即g.length-1是最后一个位置。

对于原始海报以外的读者:如果必须为正则表达式,则如果要允许空字符串,请使用/{([^}]*)}//{([^}]+)}/,如果您只想在花括号之间至少有一个字符时进行匹配。故障:



/:启动正则表达式模式



{:直角花括号



(:开始捕获



[:开始定义要捕获的字符类



^}:“除}之外的任何东西”



]:好的,这就是我们的整个类定义

* :与我们刚刚定义的类匹配的任意数量的字符



):已捕获



}:a文字大括号必须立即跟随我们捕获的内容



/:结束正则表达式模式


评论


子字符串化是根据您使用的语言而变化的事物之一。Javascript使用索引作为结束符,PHP使用所需最终结果的长度(除非它为负数,在这种情况下,它需要删除的字符数) ,C#又一次不同了……很好而且令人困惑。

– jvenema
2010-1-26的0:55



...而Python仅具有切片功能,这比IMO更好:

–格兰特·保罗
10 Mar 3 '10 at 6:25

很好,但是不确定如何使用正则表达式。也许他在问正则表达式,而我来这里是为了得到相同的答案..可悲的是,答案与该问题无关。

–baash05
2011年11月30日,0:04

@ baash05,如果您阅读了整个问题,则OP甚至都不希望学习正则表达式,因此我认为这并不是您似乎在建议的学术练习。

– Kev
2011年12月7日在16:50

我想做-1,因为问题是在寻找正则表达式,我正在寻找正则表达式,但是被接受的答案对我来说完全没有用(尽管问题本身看起来很有希望)。阅读第一条评论后,我必须承认,如果我要首先回答这个问题,我可能会以相同/相似的方式回答...因此,最后,+ 1。

–shadyyx
2014年7月4日在8:14



#2 楼

请尝试

/{(.*?)}/


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

另一种方法是

/{([^}]*)}/


这匹配除} char之外的任何字符(另一种方法是不贪心)

评论


这很好,但是可以在可变数量的花括号组合之间进行匹配吗?例如:“ {此应匹配}此不应该{此应再次},然后{继续}”?我想检索该值,该值不在大括号内。另外:句子中将不使用大括号,并且不会堆叠(这永远不会发生:“ {some {text}}”)。任何人都知道如何做到这一点:)?谢谢! (附注:赞成该解决方案)

–伊戈尔
13年5月26日在17:22

它不会捕获大括号之间的所有内容,而是会捕获大括号和大括号本身之间的所有内容。您将如何只捕获大括号内的内容?

–现实之流
16年1月19日在12:40

我喜欢它,您不需要在这里花括号,因为正则表达式解析器似乎意识到它们不是量词……好吧,我在python中这样做,但是我认为javascript regexes这样工作太

– drevicko
16年2月10日在12:26

在末尾添加g使其成为全局搜索。查看工作示例

–本杰明
16年7月5日在15:56

@ Reality-Torrent,如果我指定g选项来获取所有匹配项,我也看到它捕获了大括号。事实证明,我应该在循环中使用Regex.exec而不是Javascript中的string.match来具有g标志和允许捕获组。请参阅developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/…

–坦率
19年7月23日在20:39

#3 楼

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

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


评论


@meouw sa = s.split(“ / \ {([^}] +)\} /”);给出一个编译错误。非法重复,无效的逃脱字符。

– Likejudo
2012-12-26 at 0:22

@Anil您似乎正在使用字符串作为拆分参数,而不是正则表达式。你想做什么?

–喵
2012年12月26日22:09

#4 楼

试试:

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


例如

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


将返回gskinner.comssd.sd

评论


太好了,您能解释一下为什么在第一行中使用\}吗?

– Uzair Ali
18年4月4日在13:35

不错,但是它可以匹配以}结尾的任何组,即使它不是以{开头。

–艾哈迈德·易卜拉欣
18年5月21日在16:28

这是实际可行的唯一正确答案。

– pldg
18年7月2日在13:26



说明:尽管[^ \ {\}] +会匹配不包含花括号的所有内容,但超前断言(?=})将确保仅传递花括号之前的节。使用/ ... / g,我们可以得到所有的出现,而不仅仅是第一个。

–0 -_- 0
19年11月30日在20:45

#5 楼

这是使用javascript replace的简单解决方案

var st = '{getThis}';

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


上面的公认答案指出,使用子字符串可以轻松解决原始问题,但是使用replace可以解决更复杂的用例

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

#6 楼

此代码可在Textmate中使用,并且可以将花括号之间的CSS文件中的所有内容都匹配。

可以返回内容,然后将其全部包装在另一组括号中,如下所示:

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


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

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

#7 楼

试试这个

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


评论


正是我想要的:)这将返回结果不带花括号,其他解决方案随其返回

– Al-Mothafar
18-10-17在10:06

很好,最好的答案在这里。

–michal.jakubeczy
19年11月12日在11:42

#8 楼

您想使用正则表达式先行后退。这只会给您花括号中的内容:

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


评论


上面的花括号应该有一个反斜杠。他们在我的陈述中被剥夺了。

–罗伯特·塞萨里克(Robert Cesaric)
2010年11月11日在12:28

谢谢,今天对我有帮助。

–ProfessionalAmateur
2010-12-22 17:28

这种方法有什么缺点?

– Somatik
2012年5月11日13:24

@Somatik-是的,ECMAScript不支持负向和反向。

–RobG
2014年5月4日在7:28

注意:此示例在Java中有效。返回所有花括号中的所有值。

–复用器
19年5月7日,下午3:31

#9 楼

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

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


#10 楼

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

所以,这是我的答案

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


#11 楼

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


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

#12 楼

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

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

评论


对于多选,您可以使用/([^ {] *?)\ w(?= \})/ gmi

–ПавлоКоменда
16 Sep 23 '13:01



#13 楼

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

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


评论


很好,但这仅捕获嵌套括号内的内容

–多米尼克
18 Mar 12 '18 at 15:42

如果内容包含(),则不会捕获

– Mertce先生
19-09-27在15:49

#14 楼

甚至这在尝试解决某人的问题时也对我有帮助,


将内容拆分到花括号({})内,该花括号具有如下模式: >
例如:

 {'day': 1, 'count': 100} 


输出:

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