【问题标题】:C# regex for a string variable does not work as expect [closed]字符串变量的 C# 正则表达式不能按预期工作 [关闭]
【发布时间】:2022-01-23 12:40:45
【问题描述】:

我正在制作一个从设备读取串行消息的功能。 设备发送此类数据 - [003190983120!] 它由 12 个数字和一个“!”组成。

关键是消息有时会被切断。所以我尝试将剪切消息组合在一个变量中(字符串类型,下面代码中的临时)。但是代码并没有像我想象的那样工作。

这是我的正则表达式:静态正则表达式 regex = new Regex(@"^[0-9]{12}!");

这里是代码。

            byte[] buff = new byte[14];

            sp.Read(buff, 0, 14);
            message = System.Text.Encoding.ASCII.GetString(buff);
            if (regex.IsMatch(message))
            {
                
                Console.WriteLine("[TRUE]["
                    + message
                    + "] : ");
                temp = "";

            }
            else
            {
                temp += message;
                Console.WriteLine("[FALSE]["
                    + temp
                    + "] : ");

            }
            
            if (regex.IsMatch(temp))
            {
                Console.WriteLine("[TRUE]["
                    + temp
                    + "] : ");

                temp = "";

            }

结果来了。

[真][003334684120!]:

[真][003334783120!]:

[真][003334883120!]:

[假][00]:

[FALSE][003334983120!] :

[TRUE][003335083120!] :

[真][003335183120!]:


由于我的英语不好,我没听懂你所有的答案,但我按照建议在 if 语句之前添加了“temp”和“message”的输出日志。

这是更新的结果。

[温度][]

[消息][004083767120!]

[真][004083767120!]:

[温度][]

[消息][0040]

[假][0040]:

[温度][0040]

[消息][83866120!]

[假][004083866120!]:

[温度][004083866120!]

[消息][004083967120!]

[真][004083967120!]:

【问题讨论】:

  • “此时变量 temp 满足” - 这有什么不同??你的条件是message,而不是temp
  • 解决问题。您能否通过以下方式验证您的逻辑:(1)仅构建字符串,使其成为有效的(临时)串行消息,(2)随后确认该过程正在运行(3)然后应用正则表达式。这将有助于隔离两个问题并减少潜在的逻辑故障。
  • 在您的else 语句中,为什么不打印message 变量?该变量是正则表达式匹配的变量吗?顺便说一句,that regex matches the criteria
  • 有没有机会在 DotnetFiddle 上放一些代码? dotnetfiddle.net
  • 可能在刺痛中有不可打印的字符。尝试将输出更改为Console.WriteLine($"[FALSE][{temp}][{temp.Length}]:") 可以使用message = Regex.Replace(message, @"\p{C}+", string.Empty);删除这些字符。

标签: c# regex string


【解决方案1】:

我看到你提到英语不是你的第一语言,所以我会尽力保持我的语言清晰,如果你想更清楚,请告诉我。

您的代码完全按照您的要求执行,我认为如果您附加调试器(如果您不知道我真正建议如何学习)并逐步完成。

当您收到“部分消息”时,问题就出现了。当message 变量与正则表达式不匹配时,您进入 else 块并记录它不匹配,但您记录临时变量的值 after 并将消息变量附加到它.

所以在您的示例中,我们将此字符串拆分为 2 条消息

003334983120!

作为

第 1 部分:00 第二部分:3334983120!

收到第 1 部分时,消息与您的正则表达式不匹配,因此 00 被附加到临时变量,然后我们记录它不匹配并包含 temp 的当前值。所以我们在控制台上看到了这个

[FALSE][00] :

然后我们检查 temp 是否与您的正则表达式匹配。当前 temp 包含 00 所以它不匹配,然后我们什么也不做。

第 2 部分现已到达 - 消息与您的正则表达式不匹配,因此将 3334983120! 附加到 temp 以使 temp 等于 003334983120!(看!temp 现在是完整消息)并记录它不是匹配 - 因为 message 不匹配,但您记录了 temp 的值(我们将发现它是匹配的)

然后我们会检查 temp 是否与您的正则表达式匹配...确实如此!所以我们记录它的匹配和 temp 的值。

你看到事情在哪里变得混乱了吗?在您的 else 语句中,您记录了 message 与您的正则表达式不匹配,但随后记录了 temp 的值

将您的代码更改为如下所示

            byte[] buff = new byte[14];

            sp.Read(buff, 0, 14);
            message = System.Text.Encoding.ASCII.GetString(buff);
            if (regex.IsMatch(message))
            {
                
                Console.WriteLine("[TRUE]["
                    + message
                    + "] : ");
                temp = "";

            }
            else
            {
                
                Console.WriteLine("[FALSE]["
                    + message
                    + "] : "); // see I'm logging the message variable that was not a match
                temp += message; // you could also log this value too if you wanted 
                //Console.WriteLine($"[TEMP][{temp}]:"); // this uses string interpolation, look it up, its much better

            }
            
            if (regex.IsMatch(temp))
            {
                Console.WriteLine("[TRUE]["
                    + temp
                    + "] : ");

                temp = "";

            }
    ```

With that code you'd get output like this



[TRUE][003334684120!] :

[TRUE][003334783120!] :

[TRUE][003334883120!] :

[FALSE][00] :

//Optional temp logging => [TEMP][00]:

[FALSE][3334983120!] :

//Option temp logging => [TEMP][003335083120]:

[TRUE][003335083120!] : 

[TRUE][003335183120!] :


【讨论】:

    猜你喜欢
    • 2011-03-06
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 2011-05-17
    • 2014-04-28
    相关资源
    最近更新 更多