我有一些格式的日志字符串:
T01: Warning: Tag1: Message
T23: Tag2: Message2
我正在尝试在一个正则表达式中提取T
数字,检测是否存在Warning:
,然后是标签和消息的文本。“警告:”的可选要求虽然让我绊倒。
private const string RegexExpression = @"^T(?<Number>\d+): (?<Warning>Warning:)? (?<Tag>[^:]+): (?<Message>.*)";
private const string Message = "blar blar blar: some messsage";
//this test works
[TestMethod]
public void RegExMatchByTwoNamedGroupsWarningTest()
{
var rex = new Regex(RegexExpression);
const string wholePacket = "T12: Warning: logtag: " + Message;
var match = rex.Match(wholePacket);
Assert.IsTrue(match.Groups["Warning"].Success); //warning is present
Assert.IsTrue(match.Success);
Assert.IsTrue(match.Groups["Number"].Success);
Assert.AreEqual("12", match.Groups["Number"].Value);
Assert.IsTrue(match.Groups["Tag"].Success);
Assert.AreEqual("logtag", match.Groups["Tag"].Value);
Assert.IsTrue(match.Groups["Message"].Success);
Assert.AreEqual(Message, match.Groups["Message"].Value);
}
[TestMethod]
public void RegExMatchByTwoNamedGroupsNoWarningTest()
{
var rex = new Regex(RegexExpression);
const string wholePacket = "T12: logtag: " + Message;
var match = rex.Match(wholePacket);
Assert.IsFalse(match.Groups["Warning"].Success); //warning is missing
Assert.IsTrue(match.Success); //fails
Assert.IsTrue(match.Groups["Number"].Success); //fails
Assert.AreEqual("12", match.Groups["Number"].Value);
Assert.IsTrue(match.Groups["Tag"].Success); //fails
Assert.AreEqual("logtag", match.Groups["Tag"].Value);
Assert.IsTrue(match.Groups["Message"].Success); //fails
Assert.AreEqual(Message, match.Groups["Message"].Value);
}