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