C#Regex.Match只有花括号 – 内容? (不包括牙箍)
我一直无法找到答案:我可以使用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().Select(m => m.Value).Distinct().ToList();
我总是很喜欢它。 所以你可以使用“积极的lookbehind”(?<= ...)和“积极的向前看”(?= ...)组:
(?<=\{) [^}]* (?=\})
意思是:
- 需要在比赛前打开花括号
- 收集文本(当然) - 在我可能[^ {}] *之前评论
- 需要在比赛后关闭大括号
在C#中,与许多其他编程语言一样,正则表达式引擎支持捕获组 ,即子匹配,匹配整个正则表达式模式的子串的一部分,在括号的帮助下以正则表达式模式定义(例如1([0-9])3
将匹配123
并将值2
保存到捕获组1缓冲区中)。 捕获的文本通过Match.Groups[n].Value
访问,其中n是模式内捕获组的索引。
捕捉是更有效的外观 。 只要不需要复杂的条件,捕获组就是更好的选择。
看看我在regexhero.net上执行的正则表达速度测试:
现在, 我们如何在花括号内获得子串 ?
- 如果里面没有其他花括号,带有否定的字符类 :
{([^{}]*)
- 如果可以嵌套大括号:
{((?>[^{}]+|{(?
)|}(?<-c>))*(?(c)(?!)))
在这两种情况下,我们匹配一个开口{
,然后匹配(1)除{
或}
之外的任何字符,或(2)任何字符直到第一个配对}
。
这是示例代码 :
var matches = Regex.Matches("Test {Token1} {Token 2}", @"{([^{}]*)"); var results = matches.Cast().Select(m => m.Groups[1].Value).Distinct().ToList(); Console.WriteLine(String.Join(", ", results)); matches = Regex.Matches("Test {Token1} {Token {2}}", @"{((?>[^{}]+|{(?)|}(?<-c>))*(?(c)(?!)))"); results = matches.Cast().Select(m => m.Groups[1].Value).Distinct().ToList(); Console.WriteLine(String.Join(", ", results));
结果: Token1, Token 2
, Token1, Token {2}
。
请注意,当您没有可以在模式中具有不同大小写的文字字母时, RegexOptions.IgnoreCase
是多余的。
感谢Milosz Krajewski,没有什么可以补充,但这里是function
private List GetTokens(String str) { Regex regex = new Regex(@"(?<=\{)[^}]*(?=\})", RegexOptions.IgnoreCase); MatchCollection matches = regex.Matches(str); // Results include braces (undesirable) return matches.Cast().Select(m => m.Value).Distinct().ToList(); }
只需将括号移到括号外:
{([^}]*)}
它是C#.net的正则表达式。
@"{(.*?)}"
它显示一个
token1 token2
如果我明白你想要什么。 将正则表达式更改为{([^}]*)}
。 这只会捕获{}之间的文本,而不包括它们。