使用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 = "";
}
}
我知道你说过"最好使用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 *
我认为逻辑上是正确的,我试过了,它符合
希望它能帮助你