我目前正在制作一个从串行端口接收字符串的C#应用程序,我需要解析此数据,以便可以对其进行处理。
通过发送的字符串的SerialPort
格式如下:
*NTF,CTRL,SQL,OPEN,+,-66*NTF,CTRL,DBUSY,ON,+,-63*NTF,CTRL,DBUSY,OFF*NTF,CTRL,SQL,CLOSE*
现在我想知道如何将字符串分割为*
符号上的各个部分,我本人对此进行了几次尝试,但无法弄清楚。
String[] tmp = data.ToString().Split('*');
foreach(String word in tmp)
{
if (word.Contains(",80") || word.Contains(",81"))
{
COM_PORT_INFO_BOX.Text += word + "\r\n";
}
}
NTF,CTRL,SQL,OPEN,+,-66
NTF,CT RL,DBUSY
,ON,+,-6
3
NTF,CT
RL,DBUSY
,OFF NTF,CT
RL,SQL,C
LOSE
var regex = new Regex('*'+".+"+'*');
var matches = regex.Matches(data);
但这给了我一个错误。
NTF,CTRL,SQL,OPEN,+,-66
NTF,CTRL,DBUSY,ON,+,-63
NTF,CTRL,DBUSY,OFF
NTF,CTRL,SQL,CLOSE
我已经通过这段代码解决了这个问题:
SerialPort sp = (SerialPort)sender;
data += sp.ReadExisting().ToString();
string[] tmp = data.Split(new char[] {'\u0002','\u0003'}, StringSplitOptions.RemoveEmptyEntries);
foreach (string line in tmp)
{
if (line.Contains(",80") || line.Contains(",81") || line.Contains(",RXVCALL"))
{
COM_PORT_INFO_BOX.Text += line.Substring(1) + "\r\n";
data = "";
}
}
我知道您说过“最好使用regex”,但这是更干净的恕我直言String.Split
:
string s = "*blablablab,blablabla,blablabla,blablabla*blablabla,blabalbal,blablabla*";
string[] results = s.Split(new [] {'*'}, StringSplitOptions.RemoveEmptyEntries);
结果:
String[] (2 items)
----------------------------
blablablab,blablabla,blablabla,blablabla
blablabla,blabalbal,blablabla
要记住的一件事String.Split
是,您的字符串以定界符开头或结尾,您将分别在结果数组的开头和结尾处得到空条目。添加StringSplitOptions.RemoveEmptyEntries
参数将删除这些空条目,因此您只剩下每对星号之间的两个st。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句