请仔细阅读:这有点不寻常,你会想说“不是如何使用正则表达式”或“老兄,只需使用String.SubString()” ,“等等......
我需要编写一个正则表达式(使用预先存在的方法),它将匹配文本BETWEEN花括号,而不是花括号本身。
例如:“{MatchThisText}” AND “La la la {MatchThisText} la la la ...”
两者都匹配:“MatchThisText”
Someone asked this exact question a year ago,除了“MatchThisText”之外,他还获得了一系列与大括号相匹配的正则表达式,导致“{MatchThisText}”的匹配,而不是他(或我)需要的。
如果有人可以写一个实际上只匹配大括号之间的字符的正则表达式,我真的很感激。它应该允许任何ASCII值,并应该在第一个结束时停止匹配。
例如:“{retailCategoryUrl} / {filters}”
应该匹配: retailCategoryUrl和过滤器
但不匹配:“retailCategoryUrl} / {filters”(除了外部大括号外)
谢谢!
答案 0 :(得分:17)
的Python:
(?<={)[^}]*(?=})
在上下文中:
#!/usr/bin/env python
import re
def f(regexStr,target):
mo = re.search(regexStr,target)
if not mo:
print "NO MATCH"
else:
print "MATCH:",mo.group()
f(r"(?<={)[^}]*(?=})","{MatchThisText}")
f(r"(?<={)[^}]*(?=})","La la la {MatchThisText} la la la...")
打印:
MATCH: MatchThisText
MATCH: MatchThisText
答案 1 :(得分:12)
如果您正在使用RegExp引擎以及像Python这样的先行和后观支持,那么您可以使用
/(?<={)[^}]*(?=})/
如果不是(如javascript),您可以使用/{([^}]*)}/
并获取子字符串匹配。 Javascript示例:
"{foo}".match(/{([^}]*)}/)[1] // => 'foo'
答案 2 :(得分:8)
您需要一个非贪婪的匹配运算符*?
,以便在引擎看到关闭的卷曲支撑后立即停止匹配。然后你需要使用括号对括号内的内容进行分组。这应该这样做:
{(.*?)}
然后,您需要在正则表达式API中获取group
数字1的值。 (如何执行此操作取决于您的编程语言/ API。)
答案 3 :(得分:0)
current answer适用于.NET Regex,但需要从所有匹配项中删除花括号:
var regex = new Regex(@"(?<={)[^}]*(?=})", RegexOptions.Compiled);
var results = regex.Matches(source)
.Cast<Match>()
.Select(m => m.Value.TrimStart('{').TrimEnd('}'));
答案 4 :(得分:0)
在Javascript中,您将获得包含所有匹配项的数组。下面是一个在css`和`之间加工文本的示例,用于加工模板字符串:
yourstring.match(/css`([^}]+).`/gmi)