正则表达式捕获

时间:2012-08-22 14:51:23

标签: c# regex

我无法从字符串中捕获值。我只想要我想要捕获T:的号码。这个失败的测试解释了:

[TestMethod]
public void RegExTest()
{
    var rex = new Regex("^T([0-9]+):"); //as far as I understand, the () denote the capture group
    var match = rex.Match("T12:abc");
    Assert.IsTrue(match.Success);
    Assert.IsTrue(match.Groups[0].Success);
    Assert.AreEqual("12", match.Groups[0].Captures[0]); //fails, actual is "T12:"
}

3 个答案:

答案 0 :(得分:1)

基于零的组集合表示从索引1中捕获组 Groups[0]始终表示整场比赛 因此,您需要Groups[1]而不是上面的Groups[0]

  

MatchGroups属性返回一个GroupCollection对象   包含表示单个捕获组的组对象   比赛。集合中的第一个Group对象(索引0处)   代表整场比赛。随后的每个对象代表   单个捕获组的结果。

The Group Collection

答案 1 :(得分:1)

所以你想匹配 T 之间的数字:

这是

的简单Regex
@"(?<=T)\d+(?=:)"//no need of groups here

关于您的正则表达式:

你的正则表达式

^T([0-9]+):

应该是这样的

T(\d+)://^ is not needed and [0-9] can be represented as \d

这里

Group[0] would be T:12//a full match
Group[1] would be 12//1st match within ()i.e.1st ()
Group[2] would be //2nd match within ()i.e 2nd ()

答案 2 :(得分:0)

通过命名小组来获得它。

[TestMethod]
public void RegExTest()
{
    var rex = new Regex("^T(?<N>[0-9]+):");
    var match = rex.Match("T12:abc");
    Assert.IsTrue(match.Success);
    Assert.IsTrue(match.Groups[0].Success);
    Assert.AreEqual("12", match.Groups["N"].Value);
}

应该看起来更难:How do I access named capturing groups in a .NET Regex?