C#:正则表达式

C#:正则表达式,c#,regex,C#,Regex,我有一组行数据,如下所示 List<String> l_lstRowData = new List<string> { "Data 1 32:01805043*0FFFFFFF", "Data 3, 20.0e-3", "Data 2, 1.0e-3 172:?:CRC" ,

我有一组行数据,如下所示

 List<String> l_lstRowData = new List<string> { "Data 1 32:01805043*0FFFFFFF", 
                                                "Data 3, 20.0e-3", 
                                                "Data 2, 1.0e-3 172:?:CRC" ,
                                                "Data 6"
                                              };
因此,最后两个
列表将包含

 KeyList 

            { "Data 1" }
            { "Data 3, 20.0e-3" }
            { "Data 2, 1.0e-3" }
            { "Data 6" }



 ValueList 

            { "32:01805043*0FFFFFFF" }
            { "" }
            { "172:?:CRC" }
            { "" }
场景:

模式中的
应匹配
数据
后跟一个整数值,如果存在逗号(,),则匹配下一个字符串,即
双值

模式中的
应与
空白
后的字符串匹配。在第一个字符串中,它应与
32:01805043*0FFFFFFF
匹配,但在第三个
172:?:CRC
匹配

这是我的示例代码

 for (int i = 0; i < l_lstRowData.Count; i++)
        {
            MatchCollection M = CompiledPattern.Matches(l_lstRowData[i], 0);
            KeyList.Add(M[0].Groups["KEY"].Value);
            ValueList.Add(M[0].Groups["Value"].Value);

        }

请帮我重写我的模式。

你的代码对我有效,所以请定义哪些不起作用

此外:

  • 以“^”开始regexp,以“^”结束$
  • 使用regex.Match()而不是Matches(),因为您知道它只匹配一次
  • 我不明白你为什么使用忽略模式空白
  • 使用简单逗号代替[,],使用简单空格代替[]
  • 使用\s而不是[\t\r\n]
  • 如果指定IgnoreCase,则不需要数据|数据|数据或[A-Za-z]

如果你把它清理干净,也许你可以单独解决:)

你的代码对我有效,所以请定义什么不起作用

此外:

  • 以“^”开始regexp,以“^”结束$
  • 使用regex.Match()而不是Matches(),因为您知道它只匹配一次
  • 我不明白你为什么使用忽略模式空白
  • 使用简单逗号代替[,],使用简单空格代替[]
  • 使用\s而不是[\t\r\n]
  • 如果指定IgnoreCase,则不需要数据|数据|数据或[A-Za-z]

如果你清理了这个问题,也许你可以单独解决:)

我认为一个更简单的正则表达式可以工作:
(?data\d(?,[\d.e-]+)(?*)
将匹配你的键和值,只要你也使用
RegexOptions.IgnoreCase
标志


您可以在这里看到结果。

我认为一个更简单的正则表达式可以工作:
(?data\d(?,[\d.e-]+))(?*)
将匹配您的键和值,只要您也使用
RegexOptions.IgnoreCase
标志


你可以在这里看到结果。

我会针对失败的案例运行匹配,并将其部分分解。(例如,确定“不工作”的含义。)我会针对失败的案例运行匹配,并将其部分分解。(例如,确定“不工作”的含义。)我花了一点时间找到“问题”。在结果中,“:01805043*0FFFFFFF“应该以32开头(例如),“32:01805043*0FFFFFFF”同意上面帖子中的所有内容。此外,为了简化测试,使用诸如Rad正则表达式设计器之类的工具应该是明智的。我花了一点时间找到了“问题”。在结果中,:01805043*0FFFFFFF“应该以32开头(例如),“32:01805043*0fffffffff”“同意上面帖子中的所有内容。此外,为了简化测试,最好使用Rad正则表达式设计器之类的工具。
 KeyList 

            { "Data 1" }
            { "Data 3, 20.0e-3" }
            { "Data 2, 1.0e-3" }
            { "Data 6" }



 ValueList 

            { "32:01805043*0FFFFFFF" }
            { "" }
            { "172:?:CRC" }
            { "" }
 for (int i = 0; i < l_lstRowData.Count; i++)
        {
            MatchCollection M = CompiledPattern.Matches(l_lstRowData[i], 0);
            KeyList.Add(M[0].Groups["KEY"].Value);
            ValueList.Add(M[0].Groups["Value"].Value);

        }
 KeyList 

            { "Data 1 32" } // 32 should be in the next list
            { "Data 3, 20.0e-3" }
            { "Data 2, 1.0e-3" }
            { "Data 6" }



 ValueList 

            { ":01805043*0FFFFFFF" }
            { "" }
            { "172:?:CRC" }
            { "" }