C#Regex.Match大括号 - 仅限内容? (不包括牙箍)

时间:2013-05-14 07:59:06

标签: c# .net regex

我一直无法找到答案:我可以使用Regex.Matches方法仅返回带花括号的项目的内容吗?

如果我使用正则表达式({[^}]*})我的MatchCollection值包含大括号。我想匹配,但只返回内容。这是我到目前为止所做的:

Regex regex = new Regex(({[^}]*}), RegexOptions.IgnoreCase);
MatchCollection matches = regex.Matches("Test {Token1} {Token 2}");
// Results include braces (undesirable)
var results = matches.Cast<Match>().Select(m => m.Value).Distinct().ToList();

7 个答案:

答案 0 :(得分:24)

我总是很喜欢它。所以你可以使用“积极的lookbehind”(?&lt; = ...)和“positive lookahead”(?= ...)组:

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

表示:

  • 需要在匹配
  • 之前打开大括号
  • 收集文本(当然) - 在我之前发表评论[^ {}] *以及
  • 要求在匹配
  • 后关闭花括号

答案 1 :(得分:11)

在C#中,与许多其他编程语言一样,正则表达式引擎支持 捕获组 ,即子匹配,匹配的子串的部分整个正则表达式模式,在括号的帮助下以正则表达式模式定义(例如1([0-9])3将匹配123并将2的值保存到捕获组1缓冲区中)。捕获的文本可通过Match.Groups[n].Value访问,其中 n 是模式中捕获组的索引。

捕捉更有效的外观。只要不需要复杂的条件,捕获组就是更好的选择。

请参阅我在regexhero.net上执行的正则表达速度测试:

enter image description here

现在,如何在花括号内部获取子串?

  • 如果里面没有其他花括号,否定字符类{([^{}]*)
  • 如果可以嵌套大括号:{((?>[^{}]+|{(?<c>)|}(?<-c>))*(?(c)(?!)))

在这两种情况下,我们匹配一个开头{,然后匹配(1)除{}以外的任何字符,或(2)任何字符直到第一个配对}

以下是sample code

var matches = Regex.Matches("Test {Token1} {Token 2}", @"{([^{}]*)");
var results = matches.Cast<Match>().Select(m => m.Groups[1].Value).Distinct().ToList();
Console.WriteLine(String.Join(", ", results));
matches = Regex.Matches("Test {Token1} {Token {2}}", @"{((?>[^{}]+|{(?<c>)|}(?<-c>))*(?(c)(?!)))");
results = matches.Cast<Match>().Select(m => m.Groups[1].Value).Distinct().ToList();
Console.WriteLine(String.Join(", ", results));

结果:Token1, Token 2Token1, Token {2}

请注意,如果没有可能在模式中具有不同大小写的文字字母,则RegexOptions.IgnoreCase是多余的。

答案 2 :(得分:5)

感谢Milosz Krajewski,没有什么要补充的,但这里是函数

private List<String> GetTokens(String str)
{
    Regex regex = new Regex(@"(?<=\{)[^}]*(?=\})", RegexOptions.IgnoreCase);
    MatchCollection matches = regex.Matches(str);

    // Results include braces (undesirable)
    return matches.Cast<Match>().Select(m => m.Value).Distinct().ToList();
}

答案 3 :(得分:3)

只需将括号移到括号外:

 {([^}]*)}

答案 4 :(得分:2)

它是C#.net的正则表达式。

@"{(.*?)}"

显示

TOKEN1 token2

答案 5 :(得分:0)

如果我明白你想要什么。将正则表达式更改为{([^}]*)}。这只会捕获{}之间的文本,而不包括它们。

答案 6 :(得分:0)

有点修改@Milosz Krajewski的答案

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

这将跳过字符串中居中的单个花括号的开头和结尾。