当前位置:  开发笔记 > 编程语言 > 正文

C#和Regex - 无法识别的分组构造

如何解决《C#和Regex-无法识别的分组构造》经验,为你挑选了1个好方法。

目前正致力于我的客户/服务器应用程序论文.如果服务器收到这样的信息,我遇到了麻烦:

ProToCooL,unknown|DESKTOP-29COFES,10.20.9.53|Hewlett-Packard,179C,PCWJA001X3UHII,KBC Version 42.32|i5-3320M,2.60GHz,2,4,256,3072,U3E1,GenuineIntel|{2,(IDT High Definition Audio CODEC,IDT),(Intel(R) Display Audio,Intel(R) Corporation)}|{2,(Samsung,003355A3,M471B5773DH0-CH9  ,24,2147483648,1333),(Hynix/Hyundai,467CA639,HMT351S6EFR8A-PB  ,24,4294967296,1333)}|{1,(IDE,Hitachi HTS725050A7E630,      FT51009Y7J61BK,3,733004892,476937.531738281)}|{7,(Send To OneNote 2013,False,Local,Send to Microsoft OneNote 15 Driver),(Microsoft XPS Document Writer,False,Local,Microsoft XPS Document Writer v4),(Microsoft Print to PDF,False,Local,Microsoft Print To PDF),(HP Universal Printing PCL 6,False,Local,HP Universal Printing PCL 6),(HP LaserJet P3010 Series (10.20.9.36),False,Local,HP Universal Printing PCL 6),(Fax,False,Local,Microsoft Shared Fax Driver),(Adobe PDF,True,Local,Adobe PDF Converter)}

我已设置当前模式:

\(((?:[^()]|(?R))+)\)

它可以很好地提取我需要的所有内容,但问题是当我以这种方式在C#中使用它时:

if(soundCount > 0)
        {
            string[] smth;
            string pattern = @"\(((?:[^()]|(?R))+)\)";
            Regex match = new Regex(pattern, RegexOptions.None);

            MatchCollection matches = match.Matches(sound);
            smth = new string[matches.Count];

            int i=0;
            foreach (Match ma in matches)
            {
                smth[i] = Regex.Replace(ma.Value.Trim('(', ')'), @"\s+", "");
                Console.WriteLine(smth[i]);
                i++;
            }


            IList newSoundchip = new List();
            foreach(string s in smth)
            {
                newSoundchip.Add(new sound_chips() 
                { 
                    name = s.Split(',')[0].ToString(), 
                    manufacturer_id = Convert.ToInt32(setManufacturer(s.Split(',')[1].ToString())),
                    motherboards = newMotherboard
                });
            }
            insert.sound_chips.AddRange(newSoundchip);
        }

我得到一个:无法识别的分组构造.例外,我很难找到什么是错的因为我不太了解C#的regexp,或者找到解决这个问题的方法.



1> Wiktor Strib..:

.NET正则表达式不支持递归.您正在使用的正则表达式(\(((?:[^()]|(?R))+)\))用于PCRE,您可以在C#应用程序中将其与PCRE.NET库一起使用.

作为替代方法,您可以使用.NET正则表达式匹配平衡括号:

\(((?>[^()]+|\((?)|\)(?<-n>))+(?(n)(?!)))\)

请参阅正则表达式演示.

它将所有这12个匹配作为PCRE正则表达式返回.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有