Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.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_List - Fatal编程技术网

C# 通过与正则表达式匹配在列表中添加元素

C# 通过与正则表达式匹配在列表中添加元素,c#,regex,list,C#,Regex,List,我是一名实习生,我正在开发一个C#解决方案,它允许我从excel文件中检索单元格中的字符串。检索到此字符串后,必须使用正则表达式将此字符串的元素分隔为两个其他列表(示例和引用)。 这意味着,如果此字符串的元素对应于正则表达式,则必须在“示例”列表中发送,如果不对应,则必须在“参考列表”中发送 几天来,我一直试图解决这个问题,但我无法显示元素应与正则表达式对应的“示例”列表。无论是否显示整个列表,它都无法正常工作 字符串示例: 例1: QC4 1000 ppm;C-191108-S-0095;C-

我是一名实习生,我正在开发一个C#解决方案,它允许我从excel文件中检索单元格中的字符串。检索到此字符串后,必须使用正则表达式将此字符串的元素分隔为两个其他列表(示例和引用)。 这意味着,如果此字符串的元素对应于正则表达式,则必须在“示例”列表中发送,如果不对应,则必须在“参考列表”中发送

几天来,我一直试图解决这个问题,但我无法显示元素应与正则表达式对应的“示例”列表。无论是否显示整个列表,它都无法正常工作

字符串示例:

例1:

QC4 1000 ppm;C-191108-S-0095;C-191108-S-0095;QC4 100 ppm;QC4 1000 ppm;Et 500 ppm;Et 1000 ppm;Et 2000 ppm

例2:

;C-210104-S-117 2;C-210104-S-118-1;C-210104-S-118 2;参考100ppm QC4;参考1000ppm QC4

这是我的代码:

public static (List<string> sample, List<string> reference) parse()
{
    string imput = ReadExcel();

    List<string> sample = new List<string>();
    List<string> reference = new List<string>();

    string pattern = @"C-[0-9][0-9][0-9][0-9][0-9][0-9]-S-[0-9][0-9][0-9][0-9] ;";

    Regex rgx = new Regex(pattern);
    Regex delim = new Regex(@"\s*,\s*");

    foreach (string term in delim.Split(imput))
    {
        if (rgx.IsMatch(term))
        {
            sample.Add(term);
            sample.ForEach(Console.WriteLine);
        }
        else
        {
            reference.Add(term);
        }
    }

    return (sample, reference);
}
publicstatic(列表示例,列表引用)parse()
{
字符串输入=ReadExcel();
列表样本=新列表();
列表引用=新列表();
字符串模式=@“C-[0-9][0-9][0-9][0-9][0-9][0-9]-S-[0-9][0-9][0-9][0-9][0-9];”;
正则表达式rgx=新正则表达式(模式);
正则表达式delim=新正则表达式(@“\s*,\s*”);
foreach(delim.Split中的字符串术语(输入))
{
if(rgx.IsMatch(期限))
{
样品。添加(术语);
sample.ForEach(Console.WriteLine);
}
其他的
{
参考。添加(术语);
}
}
退货(样品、参考);
}
我不知道怎么修理它。你能帮我吗


感谢您的理解。

如果您需要此正则表达式:

C-[0-9][0-9][0-9][0-9][0-9][0-9]-S-[0-9][0-9][0-9][0-9] ;
C-[0-9]{6}-S-[0-9]{3} [0-9]
要与此匹配,请执行以下操作:

C-210104-S-117 2
您只需使用以下正则表达式:

C-[0-9][0-9][0-9][0-9][0-9][0-9]-S-[0-9][0-9][0-9][0-9] ;
C-[0-9]{6}-S-[0-9]{3} [0-9]
我在工具中添加了一些示例

编辑:要拆分列表中的元素,我不会使用正则表达式,我会使用字符串对象上可用的“.split”方法

myRow.Split(';')
Edit2:所以代码可能看起来像:

        List<string> sample = new List<string>();
        List<string> reference = new List<string>();
        string pattern = @"C-[0-9]{6}-S-[0-9]{3}( [0-9])?";
        Regex rgx = new Regex(pattern);

        foreach (string term in input.Split(';').Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s)))
        {

            if (rgx.IsMatch(term))
            {
                sample.Add(term);
                sample.ForEach(Console.WriteLine);
            }
            else
            {
                reference.Add(term);
            }
        }
List sample=newlist();
列表引用=新列表();
字符串模式=@“C-[0-9]{6}-S-[0-9]{3}([0-9])?”;
正则表达式rgx=新正则表达式(模式);
foreach(input.Split(“;”)中的字符串项。选择(s=>s.Trim())。其中(s=>!string.IsNullOrEmpty)
{
if(rgx.IsMatch(期限))
{
样品。添加(术语);
sample.ForEach(Console.WriteLine);
}
其他的
{
参考。添加(术语);
}
}

但我不明白为什么在添加示例后会出现Console.WriteLine?

示例是“示例”还是“参考”?您的意思是按
\s*分割吗\s*
?我给出的示例是开头的excel文件中的初始字符串示例。在stackoverflow的另一篇文章中,我被建议在使用“\s*;\s*”进行正则表达式匹配之前进行拆分。我不知道这是否是最好的选择。但是在代码中,您使用的是逗号
\s*,\s*
而不是分号
;拆分谢谢,对于第一个示例,它可以是同一个正则表达式?您的refex不起作用,因为在最后一个数字之前有一个空格,而您在正则表达式中不注意它。我的似乎适用于我测试的案例。因此,您可以获取整个单元格内容,使用string提供的“split”方法进行拆分,然后对于每个元素,您可以使用我提供的正则表达式来确定它是否为示例。您可能需要“.Trim()”值来删除每个元素之前/之后的空格。我调整我的答案以显示代码的外观。我刚刚编辑了我的答案,原因有两个:1)删除空元素(最后一个元素之后的空格“;”将被视为一个元素)2)调整正则表达式,因为两个列表中的示例似乎不一样。有时有一个额外的数字,有时没有。是的,对不起,我刚刚看到你的编辑,这就是为什么我删除了我以前的评论。我相信它现在能正常工作。“但我不明白为什么在添加示例后使用Console.WriteLine?[1]:”:我这样做只是为了检查代码是否正常工作。但我稍后会删除这一行。