3

私はこのようなテキストを持っています。

@@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@ 2009 年 8 月 20 日
@@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@May 3 2010@

出力を次のような配列に入れたい

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#でこれを行う方法を誰かが提案できますか、またはこれを行うための洗練された方法はありますか

前もって感謝します

4

4 に答える 4

8

これは簡単です。@(空のアイテムを削除して) 分割し、1 番目と 3 番目のアイテムをプルするだけです。

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();
于 2010-05-13T07:11:53.933 に答える
3

または単に行から余分なものを削除します

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

次に、各行をコンマで分割して配列を取得します

于 2010-05-13T07:33:16.993 に答える
2

クレイジーな正規表現ソリューションが必要な場合は、次を使用できます。

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"]);
}
于 2010-05-13T07:19:47.957 に答える
0

完全を期すために、クエリ構文を使用した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);
}
于 2010-05-13T07:18:23.127 に答える