Gio*_*and -2 c# regex string-parsing
我目前正在制作一个从串口接收字符串的c#应用程序,我需要解析这些数据,以便我可以用它来做任务.
通过它发送的字符串SerialPort格式如下:
*NTF,CTRL,SQL,OPEN,+,-66*NTF,CTRL,DBUSY,ON,+,-63*NTF,CTRL,DBUSY,OFF*NTF,CTRL,SQL,CLOSE*
Run Code Online (Sandbox Code Playgroud)
现在我想知道如何将这个字符串分成*符号上的段,我自己做了几次尝试,但无法弄明白.
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";
}
}
Run Code Online (Sandbox Code Playgroud)
NTF,CTRL,SQL,OPEN,+,-66
NTF,CT RL,DBUSY
,ON,+,-6
3
NTF,CT
RL,DBUSY
,OFF NTF,CT
RL,SQL,C
LOSE
Run Code Online (Sandbox Code Playgroud)
var regex = new Regex('*'+".+"+'*');
var matches = regex.Matches(data);
Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误.
NTF,CTRL,SQL,OPEN,+,-66
NTF,CTRL,DBUSY,ON,+,-63
NTF,CTRL,DBUSY,OFF
NTF,CTRL,SQL,CLOSE
Run Code Online (Sandbox Code Playgroud)
我通过这段代码解决了这个问题:
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 = "";
}
}
Run Code Online (Sandbox Code Playgroud)
我知道你说"最好用正则表达式",但这是更清洁恕我直言String.Split:
string s = "*blablablab,blablabla,blablabla,blablabla*blablabla,blabalbal,blablabla*";
string[] results = s.Split(new [] {'*'}, StringSplitOptions.RemoveEmptyEntries);
Run Code Online (Sandbox Code Playgroud)
结果:
String[] (2 items)
----------------------------
blablablab,blablabla,blablabla,blablabla
blablabla,blabalbal,blablabla
Run Code Online (Sandbox Code Playgroud)
要记住的一件事String.Split是,您的字符串以分隔符开头或结尾,您将分别在结果数组的开头和结尾处获得空条目.添加StringSplitOptions.RemoveEmptyEntries参数会删除那些空条目,因此您只需在每对星号之间留下两个叮咬.