我试图从文件中删除以相同单词开头的行。我非常确定正则表达式是正确的,但它似乎不起作用。我认为可能不是这样工作,所以我尝试用一个非空字符串替换。然而它仍然不起作用。有什么建议如何修复这个问题或者其他方法实现相同的功能?
string pattern = @"^smth";
Regex rgx = new Regex(pattern);
File.WriteAllText(path, rgx.Replace(File.ReadAllText(path), ""));
我试图从文件中删除以相同单词开头的行。我非常确定正则表达式是正确的,但它似乎不起作用。我认为可能不是这样工作,所以我尝试用一个非空字符串替换。然而它仍然不起作用。有什么建议如何修复这个问题或者其他方法实现相同的功能?
string pattern = @"^smth";
Regex rgx = new Regex(pattern);
File.WriteAllText(path, rgx.Replace(File.ReadAllText(path), ""));
您不需要使用正则表达式,我认为您只需要逐行读取文件,并检查每一行是否以smth
开头。要在同一位置写入,请创建文件的临时副本,然后再将其删除。
var tmpfile = Path.GetTempPath() + ".mytmpfile.txt";
File.Copy(path, tmpfile, true);
using (var sw = new StreamWriter(path, false, Encoding.UTF8))
{
using (var sr = new StreamReader(tmpfile, true))
{
var line = string.Empty;
while ((line = sr.ReadLine()) != null)
{
if (!line.Trim().StartsWith("smth"))
sw.WriteLine(line);
}
}
File.Delete(tmpfile);
}
string pattern = @"(?m)^smth";
。(?m)
将强制^
匹配行的开头,而不是整个字符串的结尾。或者在Regex.Replace
中使用RegexOptions.Multiline
标志。
更新:
您的方法是有效的,但正则表达式应该像这样:(?m)^\s*smth\b.*(?:\r?\n|\z)
:
string pattern = @"(?m)^\s*smth\b.*(?:\r?\n|\z)";
Regex rgx = new Regex(pattern);
File.WriteAllText(path, rgx.Replace(File.ReadAllText(path), ""));
.Trim()
去除空格,并检查修剪后的字符串是否以smth
开头。 - Wiktor Stribiżew\s*
)开头的整行,然后是你想要搜索的单词,接着是任意字符直到换行符或字符串结尾(.*(?:\r?\n|\z)
)。 - Wiktor Stribiżewsmth
,只需在 smth
后面添加 \b
即可。然后,以 smths
开头的行将保持不变。 - Wiktor Stribiżew