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([email protected]"
};
//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 關注
- 153 瀏覽
添加回答
舉報