为了账号安全,请及时绑定邮箱和手机立即绑定

请问关于C#中的正则表达式组

请问关于C#中的正则表达式组

C#
米琪卡哇伊 2019-11-03 08:04:29
我继承了一个包含以下正则表达式的代码块,并且试图了解它如何获得结果。var pattern = @"\[(.*?)\]";var matches = Regex.Matches(user, pattern);if (matches.Count > 0 && matches[0].Groups.Count > 1)    ...对于输入user == "Josh Smith [jsmith]":matches.Count == 1matches[0].Value == "[jsmith]"...我了解。但是之后:matches[0].Groups.Count == 2matches[0].Groups[0].Value == "[jsmith]"matches[0].Groups[1].Value == "jsmith" <=== how?看着这个问题从我了解的群体集合存储在整场比赛以及之前的比赛。但是,上面的正则表达式不只适用于[方括号] [文本] [方括号],那么“ jsmith”为什么会匹配?另外,groups集合是否总是会精确地存储2个组:整个匹配项和最后一个匹配项?
查看完整描述

3 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

match.Groups[0]始终与相同match.Value,这是整个匹配项。

match.Groups[1] 是正则表达式中的第一个捕获组。

考虑以下示例:


var pattern = @"\[(.*?)\](.*)";

var match = Regex.Match("ignored [john] John Johnson", pattern);

在这种情况下,


match.Value 是 "[john] John Johnson"

match.Groups[0]始终是一样的match.Value,"[john] John Johnson"。

match.Groups[1]是来自的捕获物组(.*?)。

match.Groups[2]是来自的捕获物组(.*)。

match.Groups[1].Captures 是另一个维度。

考虑另一个示例:


var pattern = @"(\[.*?\])+";

var match = Regex.Match("[john][johnny]", pattern);

请注意,我们正在连续查找一个或多个带括号的名称。您需要能够分别获得每个名称。输入Captures!


match.Groups[0]始终是一样的match.Value,"[john][johnny]"。

match.Groups[1]是来自的捕获物组(\[.*?\])+。与match.Value这种情况相同。

match.Groups[1].Captures[0] 是相同的 match.Groups[1].Value

match.Groups[1].Captures[1] 是 [john]

match.Groups[1].Captures[2] 是 [johnny]



查看完整回答
反对 回复 2019-11-04
?
繁花如伊

TA贡献2012条经验 获得超12个赞

Groups[0] 是您的整个输入字符串。


Groups[1]是您的组被括号所捕获(.*?)。您可以将正则表达式配置为仅捕获显式组(创建正则表达式时有一个选项),或用于(?:.*?)创建非捕获组。


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 272 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信