我正在解析我的/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
。我怎样才能返回每一行?
答案 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(':')));