为了账号安全,请及时绑定邮箱和手机立即绑定

.NET RegEx:查找函数并验证

.NET RegEx:查找函数并验证

C#
杨__羊羊 2023-09-16 20:09:35
在该项目中,我目前正在研究在触发事件中捕获来自各种来源的信号。为了分析信号,我们想要使用一些查询并为我们的信号提出命名约定。我们希望使用 RegEx 来验证一致性以及拆分信号字符串的各个部分。信号需要具有以下结构:Function(SignalName@Time)Function 和 @Time 是可选的,但 SignalName 始终是必需的。一些示例:Corp.Signals.LivingRoom.Temperature@TStart   //temperature of living room at start of eventCorp.Signals.LivingRoom.Temperature          //missing time stamp will default to start of eventint(Corp.Signals.BedRoom.NoiseLevel@T+4.20)  //integral of bed room noise from Start to 4.20 seconds into the eventCorp.Signals.Kitchen.Light@TEnd-.5           //state of the kitchen light 0.5 seconds before the end of the event到目前为止我想出了这个正则表达式:(?<open>(?<function>\w+)\(|)(?<signal>Corp\.Signals\.\w+\.\w+)(?:@T(?<time>((Start|Mid|End|)([-+]\d?(\.\d+)?)?))|)(?<-open>\)|)到目前为止,这工作得很好,但仍然匹配不属于命名方案的字符串。没有功能但末尾带有右括号的信号:Corp.Signals.BedRoom.NoiseLevel@T+4)我不确定为什么会消耗它,因为“开放”平衡组没有捕获任何内容。最后的parenteses怎么能消耗掉呢?具有函数但缺少右括号的信号。int(Corp.Signals.LivingRoom.Temperature@T-.2仅具有部分时间戳的信号(缺少时间)Corp.Signals.LivingRoom.Temperature@T+RegEx Storm 示例
查看完整描述

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)

在很大程度上可以看到命名组functionsignal以及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)断言右边的不是非空白字符

正则表达式演示

https://img4.sycdn.imooc.com/65059b3d0001c68506490308.jpg

查看完整回答
反对 回复 2023-09-16
?
梵蒂冈之花

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();


查看完整回答
反对 回复 2023-09-16
  • 2 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信