正则表达式获取文本BETWEEN两个字符

时间:2010-10-26 18:19:19

标签: regex

请仔细阅读:这有点不寻常,你会想说“不是如何使用正则表达式”或“老兄,只需使用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”(除了外部大括号外)

嘿,这对我来说真的很棘手,所以请原谅这个问题,如果对你们这些人来说这是微不足道的。

谢谢!

5 个答案:

答案 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)