目前正致力于我的客户/服务器应用程序论文.如果服务器收到这样的信息,我遇到了麻烦:
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++; } IListnewSoundchip = 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,或者找到解决这个问题的方法.
.NET正则表达式不支持递归.您正在使用的正则表达式(\(((?:[^()]|(?R))+)\)
)用于PCRE,您可以在C#应用程序中将其与PCRE.NET库一起使用.
作为替代方法,您可以使用.NET正则表达式匹配平衡括号:
\(((?>[^()]+|\((?)|\)(?<-n>))+(?(n)(?!)))\)
请参阅正则表达式演示.
它将所有这12个匹配作为PCRE正则表达式返回.