用正则表达式查找字符串问题

skevil 2015-11-12 12:24:01
各位大神,我需要在以下字符串中查找到 n Device 和CC2640,其中n为下列字符串中的序号。每符合这两个条件的取出其序号,并保存起来。我现在只能做到查到 n Device这个字符串,但是“CC2640” 这个字符串我就不知道怎么找了。求赐教谢谢

------------------

0 Device: Texas Instruments XDS100v3 A, ID:XDS-06Z4LS8QA,

Chip: CC2640

1 Device: Texas Instruments XDS100v3 A, ID:XDS-06Z4LS8QA,

Chip: CC2640

2 Device: USB Serial Port (COM19), ID:COM19,

Chip: Unknown

3 Device: 通信端口 (COM1), ID:COM1,

Chip: Unknown

-------------------------------------------------------------------------------
...全文
134 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
crystal_lz 2015-11-12
  • 打赏
  • 举报
回复
引用 8 楼 caojinrong 的回复:
[quote=引用 4 楼 crystal_lz 的回复:] [quote=引用 3 楼 chengxiaolong518 的回复:] 这个应该就是你想要的吧。
要是这样 你这个就悲剧了 0 Device: Texas Instruments XDS100v3 A, ID:XDS-06Z4LS8QA, Chip: Unknown 1 Device: Texas Instruments XDS100v3 A, ID:XDS-06Z4LS8QA, Chip: Unknown 2 Device: USB Serial Port (COM19), ID:COM19, Chip: Unknown 3 Device: 通信端口 (COM1), ID:COM1, Chip: CC2640 直接一次全部匹配出来 [/quote]
引用 2 楼 crystal_lz 的回复:

foreach(var m in Regex.Matches(strText,@"(\d+\s+Device).*?Chip:\s*(\w+)")){
    Console.WriteLine(m.Groups[1].Value + "\t" + m.Groups[2].Value);
}
人家用的是.*?,最小匹配,不会出现你说的问题的 [/quote] 他说的没有错 其实这里我忽略了一个问题 .(点号) 默认是不匹配换行符的 这一点 我也是经常被忽略掉 要么在后Regex.Match(,,RegexOption.SingleLine) 要么 就把 点号 换成 他说的那样
caojinrong 2015-11-12
  • 打赏
  • 举报
回复
引用 4 楼 crystal_lz 的回复:
[quote=引用 3 楼 chengxiaolong518 的回复:] 这个应该就是你想要的吧。
要是这样 你这个就悲剧了 0 Device: Texas Instruments XDS100v3 A, ID:XDS-06Z4LS8QA, Chip: Unknown 1 Device: Texas Instruments XDS100v3 A, ID:XDS-06Z4LS8QA, Chip: Unknown 2 Device: USB Serial Port (COM19), ID:COM19, Chip: Unknown 3 Device: 通信端口 (COM1), ID:COM1, Chip: CC2640 直接一次全部匹配出来 [/quote]
引用 2 楼 crystal_lz 的回复:

foreach(var m in Regex.Matches(strText,@"(\d+\s+Device).*?Chip:\s*(\w+)")){
    Console.WriteLine(m.Groups[1].Value + "\t" + m.Groups[2].Value);
}
人家用的是.*?,最小匹配,不会出现你说的问题的
caojinrong 2015-11-12
  • 打赏
  • 举报
回复
(@"(\d+)\s+Device:\s([^,]*),\sID:([^,]*),\s+Chip:\s([^\n]*)"); 用这个吧,最后用\n,如果Chip的内容包含空格上面的表达式就只能取到空格之前的内容。
caojinrong 2015-11-12
  • 打赏
  • 举报
回复
            Regex reg = new Regex(@"(\d+)\s+Device:\s([^,]*),\sID:([^,]*),\s+Chip:\s([^\s]*)");
            Match m = reg.Match(msg);
            while (m.Success)
            {
                Console.WriteLine("第{0}个\n\t设备:\t{1}\n\tID:\t{2}\n\t芯片:\t{3}\n\n", m.Groups[1].Value, m.Groups[2].Value, m.Groups[3].Value, m.Groups[4].Value);
                m = m.NextMatch();
            }
把所有信息都取出来了,想怎么处理自已看着办就行
chengxiaolong518 2015-11-12
  • 打赏
  • 举报
回复
引用 4 楼 crystal_lz 的回复:
[quote=引用 3 楼 chengxiaolong518 的回复:] 这个应该就是你想要的吧。
要是这样 你这个就悲剧了 0 Device: Texas Instruments XDS100v3 A, ID:XDS-06Z4LS8QA, Chip: Unknown 1 Device: Texas Instruments XDS100v3 A, ID:XDS-06Z4LS8QA, Chip: Unknown 2 Device: USB Serial Port (COM19), ID:COM19, Chip: Unknown 3 Device: 通信端口 (COM1), ID:COM1, Chip: CC2640 直接一次全部匹配出来 [/quote] 恩,不好意思给你发错了,呵呵。 其实我看了你的那个正则表达式应该改为 “(\d\s+Device)(.|\n)*?Chip:\s*(\w+)”才有效。
crystal_lz 2015-11-12
  • 打赏
  • 举报
回复
引用 3 楼 chengxiaolong518 的回复:
这个应该就是你想要的吧。
要是这样 你这个就悲剧了 0 Device: Texas Instruments XDS100v3 A, ID:XDS-06Z4LS8QA, Chip: Unknown 1 Device: Texas Instruments XDS100v3 A, ID:XDS-06Z4LS8QA, Chip: Unknown 2 Device: USB Serial Port (COM19), ID:COM19, Chip: Unknown 3 Device: 通信端口 (COM1), ID:COM1, Chip: CC2640 直接一次全部匹配出来
chengxiaolong518 2015-11-12
  • 打赏
  • 举报
回复
string regExp = @"\d\sDevice(.|\n)+?CC2640";
            string msg = @"0 Device: Texas Instruments XDS100v3 A, ID:XDS-06Z4LS8QA,
 
                              Chip: CC2640
 
                           1 Device: Texas Instruments XDS100v3 A, ID:XDS-06Z4LS8QA,
 
                              Chip: CC2640
 
                           2 Device: USB Serial Port (COM19), ID:COM19,
 
                              Chip: Unknown
 
                           3 Device: 通信端口 (COM1), ID:COM1,
 
                              Chip: Unknown";
            List<string> numbers = new List<string>();
            MatchCollection colloction = Regex.Matches(msg.Trim(), regExp);
            if (colloction.Count > 0)
            {
                Console.WriteLine("匹配{0}条。",colloction.Count);
                for (int i = 0; i < colloction.Count; i++)
                {
                    numbers.Add(colloction[i].Value.Substring(0,1));
                    //Console.WriteLine(colloction[i].Value);
                }
            }
这个应该就是你想要的吧。
crystal_lz 2015-11-12
  • 打赏
  • 举报
回复

foreach(var m in Regex.Matches(strText,@"(\d+\s+Device).*?Chip:\s*(\w+)")){
    Console.WriteLine(m.Groups[1].Value + "\t" + m.Groups[2].Value);
}
crystal_lz 2015-11-12
  • 打赏
  • 举报
回复
我不知道你在说什么 找 cc2640? strText.IndexOf("CC2640") 不就可以了吗

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧