Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的正则表达式_C#_String_Text Parsing - Fatal编程技术网

C# C语言中的正则表达式

C# C语言中的正则表达式,c#,string,text-parsing,C#,String,Text Parsing,我有这样的文字 @@MMIVLoader@ProductVer@4.1.2@BCM_7400S_LE@Product@Aug 21 2009@ @@MMIVLib@ObjectVer@4.1.2@BCM_7400S_LE@Product@Aug 21 2009@ @@HuaweFGDLDrv@ObjectVer@01.00.09@7324@PRODUCT@Aug 20 2009@ @@ProtectVer@ObjectVer@127.8.1@BCM_SDE5。03@PRODUCT@2009年8月

我有这样的文字

@@MMIVLoader@ProductVer@4.1.2@BCM_7400S_LE@Product@Aug 21 2009@ @@MMIVLib@ObjectVer@4.1.2@BCM_7400S_LE@Product@Aug 21 2009@ @@HuaweFGDLDrv@ObjectVer@01.00.09@7324@PRODUCT@Aug 20 2009@ @@ProtectVer@ObjectVer@127.8.1@BCM_SDE5。03@PRODUCT@2009年8月4日06:56:19@ @@KernelSw@ObjectVer@0.0.1@BCM-7454@PRODUCT@2007年12月19日@ @@ReceiverSw@ObjectVer@E.5.6。001@HWBC01ZS@PRODUCT@May2010年3月@

我想让输出像这样排列

MMIVLoader 4.1.2
MMIVLib         4.1.2
HuaweFGDLDrv 01.00.09
ProtectVer 127.8.1 
KernelSw 0.0.1
ReceiverSw E.5.6.001
有人能建议我如何使用正则表达式在c中实现这一点吗?或者有什么复杂的方法可以做到这一点吗


提前感谢

这很简单,您只需通过@移除空项目并拉动第一个和第三个项目即可拆分

var list = myString.Split(new String[] {Environment.NewLine},
          StringSplitOptions.RemoveEmptyEntries)                
   .Select(item => item.Split(new char[] {'@'}, 
          StringSplitOptions.RemoveEmptyEntries))
   .Where(a => a.Length > 2)
   .Select(a => new { Item = a[0], Version = a[2] }).ToArray();

为了完整起见,下面是一个具有查询语法的LINQ版本:

string[] lines = new string[] { 
            "@@MMIVLoader@ProductVer@4.1.2@BCM_7400S_LE@Product@Aug 21 2009@",
            "@@MMIVLib@ObjectVer@4.1.2@BCM_7400S_LE@Product@Aug 21 2009@",
            "@@HuaweFGDLDrv@ObjectVer@01.00.09@7324@PRODUCT@Aug 20 2009@",
            "@@ProtectVer@ObjectVer@127.8.1 @BCM_SDE5.03@PRODUCT@Aug  4 2009 06:56:19@",
            "@@KernelSw@ObjectVer@0.0.1@BCM-7454@PRODUCT@ Dec 19 2007@",
            "@@ReceiverSw@ObjectVer@E.5.6.001@HWBC01ZS@PRODUCT@May  3 2010@" };
var q = from components in
           (from line in lines
            select line.Split(new char[] { '@' }, 
                     StringSplitOptions.RemoveEmptyEntries))
        select new { Name = components[0], Version = components[2] };
foreach (var item in q)
{
    Console.WriteLine("Item: Name={0} Version={1}", item.Name, item.Version);
}

如果您确实想要疯狂的正则表达式解决方案,可以使用以下方法:

var matches = Regex.Matches(
    input,
    "@@(?<name>.*?)@(Product|Object)Ver@(?<ver>.*?)@",
    RegexOptions.IgnoreCase
).Cast<Match>().Select(m => m.Groups);

foreach (var match in matches)
{
    Console.WriteLine("{0} {1}", match["name"], match["ver"]);
}

或者干脆把多余的东西从生产线上去掉

Regex.Replace(text, @"^@@([^@]+)@[^@]+@([^@]+).*", "$1,$2",RegexOptions.Multiline);
得到

MMIVLoader,4.1.2
MMIVLib,4.1.2
HuaweFGDLDrv,01.00.09
ProtectVer,127.8.1
KernelSw,0.0.1
ReceiverSw,E.5.6.001

然后,在每一行上用逗号分开,得到一个漂亮的数组。我本来想把它分开,但是额外的@让我很恼火。RmoveEmptyEntries是一个不错的选择。我们如何使用正则表达式来执行此操作?@user34015您正在查找问题吗-/@是的,我知道。。我指的是查询语法。我会重新措辞