【问题标题】:Add an element in a list by matching with a regex通过匹配正则表达式在列表中添加元素
【发布时间】:2021-03-02 14:11:00
【问题描述】:

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

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

字符串示例:

示例 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 ; Ref 100ppm QC4 ; Ref 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);
}

我不知道如何解决它。你能帮帮我吗?

感谢您的理解。

【问题讨论】:

  • 示例是“样本”还是“参考”?
  • 你的意思是用\s*;\s*分割吗?
  • 我给出的例子,是开头的excel文件的初始字符串的例子。我必须将此字符串拆分为两个列表示例,并通过与正则表达式匹配来引用。
  • 在 stackoverflow 的另一篇文章中,有人建议我在使用 "\s*;\s*" 进行正则表达式匹配之前先拆分,我不知道这是否是最佳选择。
  • 但在代码中,您使用逗号 \s*,\s* 而不是分号 ;

标签: c# regex list


【解决方案1】:

如果你想要这个正则表达式:

C-[0-9][0-9][0-9][0-9][0-9][0-9]-S-[0-9][0-9][0-9][0-9] ;

为了匹配这个:

C-210104-S-117 2

你可以简单地使用这个正则表达式:

C-[0-9]{6}-S-[0-9]{3} [0-9]

我在工具regex101中放了一些例子

编辑:要拆分列表中的元素,我不会使用正则表达式,我会使用字符串对象上可用的“.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);
            }
        }

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

【讨论】:

  • 谢谢,第一个例子可以是同一个正则表达式?
  • 您的 refex 不起作用,因为在最后一位数字之前有一个空格,并且您没有在您的正则表达式中处理它。我的似乎适用于我测试的案例。因此,您可以获取整个单元格内容,使用字符串可用的“拆分”方法拆分,然后对于每个元素,您可以使用我提供的正则表达式来确定它是否是样本。您可能需要“.Trim()”值来删除每个元素之前/之后的空格。
  • 我调整我的答案,向您展示代码的样子
  • 我刚刚编辑了我的答案有两个原因:1)删除空元素(最后一个“;”之后的空格将被视为一个元素)和 2)调整正则表达式,因为它看起来您的两个列表中的样本不一样。有时有一个额外的数字,有时没有。
  • 是的对不起,我刚刚看到你的编辑,这就是我删除我之前评论的原因。我确信它现在可以正常工作。 “但我不明白为什么添加示例后 Console.WriteLine ?[1]:”:我这样做只是为了检查代码是否正常工作。但我稍后会删除这一行。
猜你喜欢
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
  • 2011-08-11
相关资源
最近更新 更多