从长字符串中提取10个数字

时间:2013-11-14 19:02:59

标签: c#

我很紧张。我正在阅读一个非分隔的文本文件并且除了一个细节之外已经成功:我需要在字符串行中识别一个10位数字,这是一个雇员标识符并将其链接到数据库以提取电子邮件并通过电子邮件发送给员工文件。我对每个员工单独提取文件(这是一个包含所有员工数据的大型文本文件)没有任何问题,但我需要通过电子邮件将这个文件发送给他们。现在,我有一个查询,虽然没有优化根本不会导致操作问题,因为它是一个辅助数据库,几乎没有使用。

 using (var cnn = new SqlConnection(connStr))
        {
            cnn.Open();
            using (var cmd = new SqlCommand("SELECT  EMail from Stubs WHERE CONTAINS (ID, @ID)", cnn))
            {
                cmd.Parameters.AddWithValue("@ID", (line));
                using (var rdr = cmd.ExecuteReader())
                {
                    if (rdr.HasRows)
                    {
                        while (rdr.Read())
                        {
   email = rdr.GetString(0);

                        }
                    }
                }
            }

我正在检查每条读取线并将其与字段进行比较。显然这不起作用,因为字符串总是包含这个:

Acct              0100001170                              180.18   39,870.80 

我需要提取那些10位数字,0100001170,并使用该提取的值来识别数据库中的列并获取电子邮件地址。

我怎样才能提取该号码?有可能吗?

2 个答案:

答案 0 :(得分:1)

正如Jon Skeet建议的那样,正则表达式适用于这种情况。

    string id = Regex.Match(line, @"(?<=\s)\d{10}(?=\s)").Value;

这样做是基于搜索模式捕获输入字符串的某个部分(在这种情况下为line)。我在这里建造的那个"(?<=\s)\d{10}(?=\s)“包含一些令人困惑的元素。

  • (?&lt; = \ s) - 这是空白角色\s的正面观察。这将匹配在字符串
  • 之前具有空格的任何内容
  • \ d - 这匹配数字
  • {10} - 这表示匹配前面的令牌(在这种情况下为\d)10次。
  • (?= \ s) - 与第一项相似,在字符串后查找空白

正则表达式匹配后,您应该有一个包含十个数字的字符串,可以使用.Value访问。

如果您将来发现自己正在使用正则表达式,我建议使用Regexr。它是一个Web应用程序,允许您测试正则表达式字符串和匹配,并为不同的标记提供了很好的参考。

答案 1 :(得分:0)

如果账号在每一行中处于相同的位置,这将有效:

while (rdr.Read())
{
    email = rdr.GetString(0);
    // make sure the string is long enough or you will get an index out of range exception
    if (rdr.GetString().Length() > 29)
    {
        string acctno = rdr.GetString().Substring(19, 10);
        // do something with acctno, maybe cast it to an Int64 if it is numeric
    }
}