【发布时间】: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);删除这些字符。