使用 Regex 清理换行符

Cleaning up Linebreaks with Regex

我经常从 PDF 或类似文件中复制文本,而换行符不是我想要的。我希望每个段落都是一行文本,而不是每个段落中有很多短行,段落之间有一个空行。

感谢这里的其他答案,我只需几步就可以用正则表达式解决这个问题:

  1. 找到所有双换行符 [\r\n][\r\n] 并用 -------placeholder-------- 这样的占位符字符串替换它们。别担心,该占位符将恢复为段落之间的 space。
  2. 既然我们知道了段落分界符的位置,就可以安全地删除所有换行符了。将 [\r\n] 替换为空。
  3. 现在整个文档应该只有一行文本,并用占位符字符串代替段落分隔符。
  4. -------placeholder-------- 替换为双换行符 [\r\n][\r\n]
  5. 完成!

但我很好奇:有没有办法用更少的步骤做到这一点?例如,在正则表达式中可以说 "find all line breaks, except pairs of line breaks, and replace with nothing" 吗?这将消除对占位符步骤的需要。

好的,我可以告诉你 \n

它是如何工作的

在 C# 中:

var input = "test\ntest2\n\ntest3\ntest4";
var regex = @"\n(?:(?=[^\n])(?<=[^\n]\n))";
var s2 = Regex.Replace(input,regex, "");
Console.WriteLine(s2);

结果:

testtest2

test3test4

而且我想我得到它是为了 \r\n - 但要彻底测试它 ;)

var input = "test\r\ntest2\r\n\r\ntest3\r\ntest4";
var regex = @"(?<!\r\n)\r\n(?!\r\n)";

var s2 = Regex.Replace(input,regex, "");
Console.WriteLine(s2);

结果:

testtest2

test3test4

是的,可以用一个正则表达式来做到这一点。
做法是找两个用换行符隔开的字母。

示例:
这是段落的第一句.\nT这是第二句。

这是第二段。


有道理吗?

这有两个版本。非换行空白修剪
并且没有修剪。

 # Trimming:
 # Find:  (?<=\S)[^\S\r\n]*\r\n[^\S\r\n]*(?=\S)
 # Replace ' '

 (?<= \S )
 [^\S\r\n]* \r \n [^\S\r\n]* 
 (?= \S )

 # Non-Trimming
 # Find:   (\S[^\S\r\n]*)\r\n([^\S\r\n]*\S)
 # Replace: ' '

 ( \S [^\S\r\n]* )             # (1)
 \r \n 
 ( [^\S\r\n]* \S )             # (2)