替换一行中的特定文本

本文关键字:文本 一行 替换 | 更新日期: 2023-09-27 18:37:02

我想替换特定部分的一行中的特定文本。 示例文本:

begin 355 weapon item_type=weapon
begin 356 armor item_type=armor

我想将item_type=none item_type=weapon替换为第 1 行的值355,而无需替换其中的所有文本weapon并且不清理所有行并全部替换为 1 行。这是我到目前为止的代码:

private void button2_Click(object sender, EventArgs e)
{
    var data = File
                .ReadLines("itemdata.txt")
                .Where(x => x.Contains(itemSrchtxt.Text))
                .Take(1)
                .SelectMany(x => x.Split(''t'))
                .Select(x => x.Split('='))
                .Where(x => x.Length > 1)
                .ToDictionary(x => x[0].Trim(), x => x[1]);
    StreamReader reader = new StreamReader(Directory.GetCurrentDirectory() + @"'itemdata.txt");
    string content = reader.ReadLine();
    reader.Close();
    content = Regex.Replace(content, data["item_type"], textitem_type.Text);
      StreamWriter write = new StreamWriter(Directory.GetCurrentDirectory() + @"'itemdata.txt");
    write.WriteLine(content);
    write.Close();
}

这是我使用的真实行:

item_begin  questitem   783 [_alankells_receipt]    item_type=questitem

替换一行中的特定文本

这在 LINQ 中不是,但 LINQ 看起来有点矫枉过正:

var lines = File.ReadAllLines(Directory.GetCurrentDirectory() + @"'itemdata.txt");
if (lines.Length > 0)
{
    var fields = lines[0].Split(''t');
    if (fields.Length >= 4 && fields[1] == "355" && fields[3] == "item_type=weapon")
        fields[3] = "item_type=none";
    lines[0] = string.Join("'t", fields);
}
File.WriteAllLines(Directory.GetCurrentDirectory() + @"'itemdata.txt", lines);

完成测试

创建一个名为 C:'temp't.txt 的文件。在记事本中打开它并将其粘贴到:

begin   355 weapon  item_type=weapon
begin   356 armor   item_type=armor

确保有一个选项卡('t)而不是355和武器之间的空格,并且在356和装甲之间的第二行相同(当我复制粘贴时,选项卡显示为空格)。保存文件并关闭记事本。

运行以下代码(我使用 LinqPad):

var lines = File.ReadAllLines(@"C:'temp't.txt");
if (lines.Length > 0)
{
    var fields = lines[0].Split(''t');
    if (fields.Length >= 4 && fields[1] == "355" && fields[3] == "item_type=weapon")
        fields[3] = "item_type=none";
    lines[0] = string.Join("'t", fields);
}
File.WriteAllLines(@"C:'temp't.txt", lines);

在记事本中再次打开该文件。