Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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#_Regex_Parsing - Fatal编程技术网

C# 关于如何使用表格数据解析字符串的建议

C# 关于如何使用表格数据解析字符串的建议,c#,regex,parsing,C#,Regex,Parsing,考虑以下字符串: ============================================================================================================================================================ grp-membership table ===============================================================

考虑以下字符串:

============================================================================================================================================================
grp-membership table
============================================================================================================================================================
mcast-grp-addr |vlan-id|mcast-src-addr |port                                      |state
---------------+-------+---------------+------------------------------------------+-------------------------------------------------------------------------
111.50.0.10     4000    0.0.0.0         1/1/4/20                                   full-view
111.60.1.0      4000    0.0.0.0         1/1/4/20                                   full-view
111.60.3.52     4000    0.0.0.0         1/1/4/20                                   full-view
111.60.4.80     4000    0.0.0.0         1/1/4/20                                   full-view
111.60.6.60     4000    0.0.0.0         1/1/4/20                                   full-view
------------------------------------------------------------------------------------------------------------------------------------------------------------
grp-membership count : 5
============================================================================================================================================================
如果此数据的源是一个文件,则解析它会很简单,因为我会逐行进行解析,但不幸的是,它是一个字符串,显然没有任何\n或\r可以知道行何时结束

凭借我对正则表达式的有限知识,我能够获得表名、列名和底部的计数,但我不知道如何获取数据、对每个记录进行分组以及将每个字段放入正确的列中

我想要的是以下内容:

public class GroupMembership  
{  
   public string McastGrpAddr {get; set;}  
   public int VlanId {get;set;}  
   public string McastSrcAddr {get;set;}  
   public string Port {get;set;}  
   public string State {get;set;}  
}  

var whatever = new List<GroupMembership>();
公共类组成员资格
{  
公共字符串McastGrpAddr{get;set;}
公共int VlanId{get;set;}
公共字符串McastSrcAddr{get;set;}
公共字符串端口{get;set;}
公共字符串状态{get;set;}
}  
var whather=新列表();
或者类似的

我将解析几个具有类似结构的不同字符串,这样我就不必硬编码任何东西

最简单的方法是什么?正则表达式是一种好方法,还是有更好的方法

谢谢。

试试这个:

string text = "your string here";

string pattern = @"
(?<grp> \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} )  # pattern for mcast-grp-addr
\s+
(?<id> \d+ )                                  # pattern for vlan-id
\s+
(?<src> \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} )  # pattern for mcast-src-addr
\s+
(?<port> \d{1,3}/\d{1,3}/\d{1,3}/\d{1,3} )    # pattern for port 
\s+
(?<state> .+? )                               # pattern for state
(?= \d | -- | \r\n )                          # lookahead for digit or -- or newline
";

var matches = Regex.Matches(text, pattern, RegexOptions.IgnorePatternWhitespace);
var list = new List<GroupMembership>();

foreach (Match match in matches)
{
    var membership = new GroupMembership();

    membership.McastGrpAddr = match.Groups["grp"].Value;
    membership.VlanId = int.Parse(match.Groups["id"].Value);
    membership.McastSrcAddr = match.Groups["src"].Value;
    membership.Port = match.Groups["port"].Value;
    membership.State = match.Groups["state"].Value;

    list.Add(membership);
}
string text=“您的字符串在此”;
字符串模式=@“
(?\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})mcast grp addr的模式
\+
vlan id的(?\d+)#模式
\+
(?\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})mcast src addr的模式
\+
(?\d{1,3}/\d{1,3}/\d{1,3}/\d{1,3})端口模式
\+
(?.+)#状态模式
(?=\d |--| \r\n)#向前看数字或--或换行符
";
var matches=Regex.matches(文本、模式、RegexOptions.IgnorePatternWhitespace);
var list=新列表();
foreach(匹配中的匹配)
{
var membership=新的GroupMembership();
membership.McastGrpAddr=match.Groups[“grp”].Value;
membership.VlanId=int.Parse(match.Groups[“id”].Value);
membership.McastSrcAddr=match.Groups[“src”].Value;
membership.Port=match.Groups[“Port”].Value;
membership.State=match.Groups[“State”].Value;
名单.增加(成员);
}

注意前瞻模式。它取决于全视图和IP数字之间的符号。

您的字符串是否包含那些长的
================
?如果是这样,他们会告诉你行的长度。使用该信息确定一行的结束位置和另一行的开始位置。因此,您在此处发布之前编辑了字符串?因为它有新行字符…事实上,找到这一行:
---------------+------------------+--------------------------------------+--------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------
并使用
IndexOf
查找
+
。这将为您提供字段的宽度。然后您可以使用
子字符串
依次提取每个字段。您确定在“状态”列中没有省略空格吗?如果此列中没有填充空格,则解析此结构将变为。。。有趣。在全视图和IP数字之间有符号吗?我在regexstorm.net上尝试了这个正则表达式,但它有一些问题。如果我按原样复制它,它就不会选择任何内容。当我删除最后一节“(?=\d |--| \r\n)”时,列McastGrpAddr上的地址将不被选择,如果我将其更改为“(?=\d)”,则第一个McastGrpAddr将不被选择,每组将在下一条记录上选择该地址。看起来这是一个不错的选择,但是正则表达式需要调整。@SergioRomero-我在正则表达式风暴上测试了这个正则表达式。它工作正常。你检查了忽略空白?