2 回答
TA贡献1777条经验 获得超10个赞
您可能会做的是使用交替来匹配具有函数和左括号和右括号的部分,或者匹配不匹配可选时间的信号的部分。
在交替中,您可以使用 C# 支持的相同组名称。
(?<!\S)(?:(?<function>\w+)\((?<signal>Corp\.Signals(?:\.\w+)*)(?:@T(?<time>(?:Start|Mid|End)?(?:[-+](?:\d+(?:\.\d+)?)?|\.\d+))?)?\)|(?<signal>Corp\.Signals(?:\.\w+)*)(?:@T(?<time>(?:Start|Mid|End)?(?:[-+](?:\d+(?:\.\d+)?|\.\d+))?)?)?)(?!\S)
在很大程度上可以看到命名组function
,signal
以及time
(?<!\S)
断言左边的不是非空白字符(?:
非捕获组@T(?<time>(?:Start|Mid|End)?(?:[-+](?:\d+(?:\.\d+)?)?|\.\d+))?
(?<function>\w+)
\(
匹配左括号(?<signal>Corp\.Signals(?:\.\w+)*)
(?:
非捕获组)?
关闭非捕获组并使其可选\)
匹配右括号|
或者(?<signal>Corp\.Signals(?:\.\w+)*)(?:@T(?<time>(?:Start|Mid|End)?(?:[-+](?:\d+(?:\.\d+)?|\.\d+))?)?)?
与前面的部分相同,没有函数和括号
)
(?!\S)
断言右边的不是非空白字符
TA贡献1900条经验 获得超5个赞
尝试以下操作:
string[] inputs = {
"Corp.Signals.LivingRoom.Temperature@TStart",
"int(Corp.Signals.BedRoom.NoiseLevel@T+4)",
"Corp.Signals.LivingRoom.Temperature@TMid+2.3",
"Corp.Signals.LivingRoom.Temperature",
"Corp.Signals.LivingRoom.Temperature@T+",
"Corp.Signals.BedRoom.NoiseLevel@T+4)",
"int(Corp.Signals.LivingRoom.Temperature@T-.2"
};
//Function(SignalName@Time) sample, Function and Time optional
string pattern = @"^((\w[\w.]+(@T(([+-](\d+|\d*.\d+))|\w+))?)|(\w+\(\w[\w.]+(@T(([+-](\d+|\d*.\d+))|\w+))?\)))$";
foreach (string input in inputs)
{
Match match = Regex.Match(input, pattern);
Console.WriteLine("Success : {0}, Expression : '{1}'", match.Success, input);
}
Console.ReadLine();
- 2 回答
- 0 关注
- 105 浏览
添加回答
举报