如何从列表中提取双引号内的所有内容?

本文关键字:列表 提取 | 更新日期: 2023-09-27 18:07:14

我有代码:

class Program {
   static void Main(string[] args) {
   const string f = "../../../input.txt";
   List < string > lines = new List < string > ();
   using(StreamReader r = new StreamReader(f)) {
            string line;
            while ((line = r.ReadLine()) != null) {
                if (line.StartsWith("    <job_number") && line.EndsWith(">")) {
                    lines.Add(line);
                }
            }
        }
        foreach(string s in lines) {
            Console.WriteLine(s);
        }
        Console.Read();
    }
}

在while循环之后,我运行一个条件来查找任何以某个字符串开始并以某个字符串结束的行。这就是字符串的样子:

<job_number "1234" />
<job_number "1829" />

如何从引号内提取数字?此时控制台打印出整行代码:

<job_number "1234" />
<job_number "1829" />

我想:

1234
1829

我已经研究过Regex,但它使我非常困惑。

编辑:我需要添加,我正在解析的文件是一个系统配置文件,其中包含许多其他数据。我已经设法创建了一个名为lines的列表,它可以获得我需要的确切值。现在我需要在这个列表中添加一些格式,以便从列表中获取值(引号内的所有内容)。

如何从列表中提取双引号内的所有内容?

如果你热衷于LINQ:

var str = @"<job_number ""1234"" />";
var num = new string(str.Where(c => Char.IsDigit(c)).ToArray());
Console.WriteLine(num); // 1234

在您的情况下,与'd+进行简单的正则表达式匹配就可以完成工作。

//...
while ((line = r.ReadLine()) != null)
{
    var re = Regex.Match(line, @"('d+)");
    if (re.Success) 
    {
        var val = re.Groups[1].Value; 
        lines.Add(val);
    }
}
//...

编辑:

你当然可以根据你的需要改变正则表达式,例如:

var re = Regex.match(line, "job_number''s'"(''d+)'"");
如果文件中包含其他数字,

可能更合适。

您正在解析的文件实际上是XML为什么不直接将格式标准化为XML投诉呢?

<Jobs>
 <Job Number="1234" />
 <Job Number="1235" />
</Jobs>

然后,您可以简单地使用Linq to XML获取所有Job元素并枚举它们的Number属性。

    XDocument doc = XDocument.Load("XMLFile1.xml");
    var numbers = from t in doc.Descendants("Job")
                  select t.Attribute("Number").Value;
    foreach (var number in numbers)
    {
        Console.WriteLine(number);
    }

如果字符串的格式是不变的,你可以用一个简单的Split方法在一行中完成:

   string value = input.Split('"')[1];

例如:

   string[] s =
   {
       @"<job_number ""1234"" />",
       @"<job_number ""1829"" />"
   };
   for (int i = 0; i < s.Length; i++) Console.Write(s[i].Split('"')[1] +",  ");

输出:1234, 1829

使用IndexOfSubstring将以速度,内存和简单性的方式完成工作(部分)。

if (line.StartsWith("    <job_number") && line.EndsWith(">")) {
    int start = line.IndexOf("'"") + 1;
    int end = line.IndexOf("'"", start);
    if (start > 0 && end > 0)
    {
        string numberAsString = line.Substring(start, end - start);
        int number;
        if (int.TryParse(numberAsString, out number))
        {
            lines.Add(number);
            //Console.WriteLine(number);
        }
    }
}