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

本文关键字:数组 字符串 中的 Regex 使用 | 更新日期: 2023-09-27 18:30:11

im目前正在制作一个从串行端口接收字符串的c#应用程序,我需要解析这些数据,以便对其进行处理。

通过SerialPort发送的字符串的格式如下:

*NTF,CTRL,SQL,OPEN,+,-66*NTF,CTRL,DBUSY,ON,+,-63*NTF,CTRL,DBUSY,OFF*NTF,CTRL,SQL,CLOSE*

现在我想知道如何在CCD_ 2符号上将这个字符串分割成段,我自己也试过几次,但都想不通。

我的尝试是:

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 = "";
    }
}          

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

我知道你说过"最好使用regex",但这是使用String.Split:的更干净的IMHO

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参数会删除这些空条目,因此每对星号之间只剩下两个Sting。

这对我在regexr.com 上有效

正则表达式的问题是,结尾"*"需要用作第一个条目的结尾和第二个条目的开头。但由于它已经用于第一个,所以在第二个中被忽略了。

这就是我使用"''2"反向参考的原因

'2(.+?)('*)
'2 -> backreference to the second group ('*)
(.+?) -> every character until a "*" is found
('*) -> The character thats ending a single Entry

试试这个

([^'*]('.*)[^'*])*

它起作用了http://regexstorm.net/tester

[^'*] = match any character which is not *
('.*) = match any character
so the regex explanation is 
at first match any character that is not *, then match any character that does not ends with *

我认为逻辑上是正确的,我试过了,它符合

希望它能帮助你