解析文件以获取C#中的名称列表

时间:2009-08-03 12:14:34

标签: c#

我正在解析我的/etc/passwd文件,如下所示:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

我希望我的程序返回以下内容:

root
bin
daemon
...
sync

我目前的代码是:

Regex expression = new Regex(@"^\w*");
foreach (Match myMatch in expression.Matches(txt))
{
    txtout.Text = myMatch.ToString();    
}

但是,我只是使用此代码返回root。我怎样才能返回每一行?

4 个答案:

答案 0 :(得分:5)

使用正则表达式是一种矫枉过正,如果我理解你的意图正确,你想在第一个':'字符之前检索子字符串。

using (StreamReader reader = new StreamReader ("/etc/passwd")) {
    string line = "";
    while((line = reader.ReadLine()) != null) {
         string userName = line.Substring(0, line.IndexOf(':'));
    }
}

答案 1 :(得分:0)

如果添加指定要使用多行支持的RegexOption,则会获得每一行。我从头脑中不知道它,我认为它是RegexOptions枚举的一部分。

此致

Sebastiaan

答案 2 :(得分:0)

你显然需要循环遍历文件中的每一行,而不是整体查看文件的内容(作为字符串)。这是Mono吗?

 Regex expression = new Regex(@"^\w*");
 var passwd = new StreamReader( "/etc/passwd" );
 var users = new List<string>();
 while (passwd.Peek() >= 0)
 {
     var line = passwd.ReadLine();
     foreach (Match myMatch in expression.Matches(txt))
     {
         users.Add( myMatch.ToString() );
     }
 }

 // now users will contain all the users in the file

答案 3 :(得分:0)

var names = File.ReadAllLines(fileName)
                .Select(line => line.Substring(0, line.IndexOf(':')));