我无法从字符串中捕获值。我只想要我想要捕获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:"
}
答案 0 :(得分:1)
基于零的组集合表示从索引1中捕获组
Groups[0]
始终表示整场比赛
因此,您需要Groups[1]
而不是上面的Groups[0]
。
MatchGroups属性返回一个GroupCollection对象 包含表示单个捕获组的组对象 比赛。集合中的第一个Group对象(索引0处) 代表整场比赛。随后的每个对象代表 单个捕获组的结果。
答案 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?