亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

.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 [email protected]           //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([email protected]僅具有部分時間戳的信號(缺少時間)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([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();


查看完整回答
反對 回復 2023-09-16
  • 2 回答
  • 0 關注
  • 153 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號