在C#中使用正则表达式替换“新行”字符

4

我希望能够定位文本文件中包含“字母或数字”、“换行符”、“字母或数字”序列的每个字符串,然后将“换行符”替换为“空格”。

到目前为止,这是我尝试过的:

private void button3_Click(object sender, EventArgs e)
{
     string pathFOSE = @"D:\Public\temp\FOSEtest.txt";     
     string output = Regex.Replace(pathFOSE, @"(?<=\w)\n(?=\w)", " ");                      

     string pathNewFOSE = @"D:\Public\temp\NewFOSE.txt";
     if (!System.IO.File.Exists(pathNewFOSE))
     {
          // Create a file to write to. 
          using (System.IO.StreamWriter sw = System.IO.File.CreateText(pathNewFOSE))
          {                
          }
     File.AppendAllText(pathNewFOSE, output);
     }
}

但是我的程序只创建一个新的文本文件,其中仅包含此行"D:\Public\temp\FOSEtest.txt"。有什么想法吗?在Windows7中搜索文本文件中的新行是使用\n的正确方法吗?谢谢。 编辑:我按照Avinash的建议进行了更改,并说明我正在使用Windows 7。 编辑2:我认为在尝试建议之前需要理解Replace发生在路径字符串而不是它所导致的文件上。 最终编辑:一切都正常工作,感谢stribizhev,我只是复制粘贴了他的答案。感谢每个给予回应的人!

换行符的使用取决于您的操作系统。 - Krisztián Balla
不确定您的意思,但我将\n替换为Environment.NewLine以获得相同的结果。我认为我需要先了解为什么路径被写入文本文件。 - Loukoum Mira
2个回答

4
你需要使用正向后顾。
Regex.Replace(pathFOSE, @"(?<=\w)\n(?=\w)", " "); 
                            ^

(?=\w)被称为正向先行断言,它断言匹配后面必须是一个单词字符。

或者

Regex.Replace(pathFOSE, @"(?<=\w)[\r\n]+(?=\w)", " "); 

我仍然只得到一个写有路径的文本文件。我猜还有其他问题,不过感谢您帮我解决了这个问题。 - Loukoum Mira
尝试使用@"(?<=\w)\r\n(?=\w)",因为Windows使用回车符。或者使用@"(?<=\w)[\r\n]+(?=\w)" - Avinash Raj

3
在Windows中,换行通常看起来像\r\n(回车 + 换行符)。 因此,您可以匹配前后是字母数字的换行符。

string output = Regex.Replace(pathFOSE, @"(?<=\w)\r\n(?=\w)", " ");

注意,\w也会匹配Unicode字母和下划线。如果您不需要该行为(只需要匹配英文字母),请使用

string output = Regex.Replace(pathFOSE, @"(?i)(?<=[a-z0-9])\r\n(?=[a-z0-9])", " ");

如果您的文本中包含来自各种操作系统或程序的换行符,您可以使用

string output = Regex.Replace(pathFOSE, @"(?i)(?<=[a-z0-9])(?:\r\n|\n|\r)(?=[a-z0-9])", " ");

如果有多个换行符,请添加+定量词(?:\r\n|\n|\r)+

要对文件内容进行搜索和替换,您需要读取该文件。

您可以使用以下方式完成:

var pathFOSE = @"D:\Public\temp\FOSEtest.txt";
var contents = File.ReadAllText(pathFOSE);
var output = Regex.Replace(contents, @"(?i)(?<=[a-z0-9])(?:\r\n|\n|\r)(?=[a-z0-9])", " ");

var pathNewFOSE = @"D:\Public\temp\NewFOSE.txt";
if (!System.IO.File.Exists(pathNewFOSE))
{
    File.WriteAllText(pathNewFOSE, output);
}

谢谢您提供这么详细的答案。一旦我明白为什么Replace是在路径字符串上进行而不是在其所指向的文件上进行,这将非常有帮助。 - Loukoum Mira
你需要先读取文件:var contents = File.ReadAllText(pathFOSE);。然后在 contents 上执行替换操作,最后将修改后的内容写入新文件。 - Wiktor Stribiżew
好的,我认为你只需要使用ReadAllText。 我思考得比打字快 :) - Wiktor Stribiżew
哦,我意识到自己做错了...请指点正确的方法吧 ;) - Loukoum Mira
我已经更正了我的答案。我必须说,你的代码相当混乱 :) - Wiktor Stribiżew
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接