我从设备读取如下信息:
(Running) 始自 2006-04-27 13:58:55 总计:13255267 写指示=611
0 UCIB=3897 slot=10 port=4 vlan=541 PPP
LD780825@loudi 0.0.0.0 00-e0-4c-81-48-80
2007-12-10 18:19:21 (55)RDS srv reject 参考=0
-----------------------------------------------------------
1 UCIB=6150 slot=10 port=4 vlan=56 PPP
LD59736@loudi 0.0.0.0 00-0c-6e-82-68-73
2007-12-10 18:07:39 (55)RDS srv reject 参考=0
-----------------------------------------------------------数据格式如上需要把
slot=10
port=4
vlan=541
LD59736@loudi
00-0c-6e-82-68-73
2007-12-10 18:07:39
RDS srv reject 取出来,并把 这7项存到数据库,对正则不怎么熟悉,现在只是一步一步把
----------------------------------------------------------- 中内容取出来了
但是按照
string r1 = @"slot\=\d+ port\=\d+ vlan\=\d+";
Regex r = new Regex(r1);//, RegexOptions.Multiline | RegexOptions.Compiled);
Match m = r.Match(sqlb.ToString()); //sqlb 是StringBuilder 变量,就是取-------- 之间的内容MessageBox.Show(m.Value.ToString(), "提示!", MessageBoxButtons.OK, MessageBoxIcon.Information);没有符合的数据,正则好像没错.不知道哪里有问题,麻烦大家指点下,谢谢了.
(Running) 始自 2006-04-27 13:58:55 总计:13255267 写指示=611
0 UCIB=3897 slot=10 port=4 vlan=541 PPP
LD780825@loudi 0.0.0.0 00-e0-4c-81-48-80
2007-12-10 18:19:21 (55)RDS srv reject 参考=0
-----------------------------------------------------------
1 UCIB=6150 slot=10 port=4 vlan=56 PPP
LD59736@loudi 0.0.0.0 00-0c-6e-82-68-73
2007-12-10 18:07:39 (55)RDS srv reject 参考=0
-----------------------------------------------------------数据格式如上需要把
slot=10
port=4
vlan=541
LD59736@loudi
00-0c-6e-82-68-73
2007-12-10 18:07:39
RDS srv reject 取出来,并把 这7项存到数据库,对正则不怎么熟悉,现在只是一步一步把
----------------------------------------------------------- 中内容取出来了
但是按照
string r1 = @"slot\=\d+ port\=\d+ vlan\=\d+";
Regex r = new Regex(r1);//, RegexOptions.Multiline | RegexOptions.Compiled);
Match m = r.Match(sqlb.ToString()); //sqlb 是StringBuilder 变量,就是取-------- 之间的内容MessageBox.Show(m.Value.ToString(), "提示!", MessageBoxButtons.OK, MessageBoxIcon.Information);没有符合的数据,正则好像没错.不知道哪里有问题,麻烦大家指点下,谢谢了.
另外,我尝试着修改 r1 为“@"slot\=\d+"”,使用测试数据“ UCIB=6150 slot=10 port=4”,结果显示出了正确匹配,我怀疑是这些 Key/Value 对之间的空白字符的问题。
可能有1-2M
不能一次把读取出来
需要一次读一点.
Split() 效率低,而且在这里似乎不合适用.
string content = "";
string regex = "slot=(?<slot>\\d+)\\s+port=(?<port>\\d+)\\s+vlan=(?<vlan>\\d+)\\s+PPP\\s+(?<src>.*?)\\s+\\" +
"d+\\.\\d+\\.\\d+\\.\\d\\s+(?<mac>.*?)\\s+(?<date>\\d{4}-\\d{1,2}-\\d{1,2}\\s*\\d{1,2}:\\d{1,2}" +
":\\d{1,2})\\s+\\(55\\)(?<last>[\\S]+?\\s+[\\S]+?\\s+[\\S]+?)\\s";
System.Text.RegularExpressions.RegexOptions options = System.Text.RegularExpressions.RegexOptions.IgnoreCase;
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(regex, options);
foreach (System.Text.RegularExpressions.Match item in reg.Matches(content))
{
string solt = item.Groups["slot"].Value;
.
.
.
//以此类推,分别取其组的值,存入数据库
}
private void button1_Click(object sender, EventArgs e)
{
listBox1.Items.Clear(); Regex anExpr = new Regex(@"slot=(?<slot>\d+).*?port=(?<port>\d+).*?vlan=(?<vlan>\d+).*?(?<host>\w+@\w+).*?(?<ID>[\w|-]{17}).*?(?<date>[\d|:|-]{10}).*?(?<time>[\d|:|-]{8})\s+(?<tag>\(\d+\).*?)\s+参考.*?-+",
RegexOptions.IgnoreCase | RegexOptions.Singleline);
Match amt = anExpr.Match(textBox1.Text);
while (amt.Success)
{
//匹配开始
listBox1.Items.Add("!!!!");
listBox1.Items.Add("slot=" + amt.Groups["slog"].Value);
listBox1.Items.Add("port=" + amt.Groups["port"].Value);
listBox1.Items.Add("host=" + amt.Groups["host"].Value);
listBox1.Items.Add("date=" + amt.Groups["date"].Value);
listBox1.Items.Add("id=" + amt.Groups["ID"].Value);
listBox1.Items.Add("tag=" + amt.Groups["tag"].Value);
listBox1.Items.Add("vlan=" + amt.Groups["vlan"].Value);
listBox1.Items.Add("time=" + amt.Groups["time"].Value);
amt = amt.NextMatch();
}
}
(?<slot>slot=\d+)\s*(?<port>port=\d+)\s*(?<vlan>vlan=\d+)\s*[\s\S]+?\s*(?<item1>[a-zA-Z0-9]+@[a-zA-Z0-9]+)\s*[\s\S]+?\s*(?<item2>[a-z0-9]{2}-[a-z0-9]{2}-[a-z0-9]{2}-[a-z0-9]{2}-[a-z0-9]{2}-[a-z0-9]{2})\s*(?<item3>\d{4}-\d{2}-\d{2}\s*\d{2}:\d{2}:\d{2})\s*(?<item4>(.+?))参考