在c#中使用Regex将字符串解析为数组

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)

D S*_*ley 5

我知道你说"最好用正则表达式",但这是更清洁恕我直言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参数会删除那些空条目,因此您只需在每对星号之间留下两个叮咬.

  • 您必须有一些嵌入的空格或控制字符.这与`string.Split`无关,使用正则表达式你的结果不会有任何不同.我会使用调试器仔细查看这些字符,看看是否可以过滤它们. (2认同)
  • @GiovanniLeGrand你在这里写的内容与你提出的问题不符.你能用确切的例子更新你的问题吗?提供的答案对你的`blabla`字符串有效. (2认同)