使用 Regex 清理换行符
Cleaning up Linebreaks with Regex
我经常从 PDF 或类似文件中复制文本,而换行符不是我想要的。我希望每个段落都是一行文本,而不是每个段落中有很多短行,段落之间有一个空行。
感谢这里的其他答案,我只需几步就可以用正则表达式解决这个问题:
- 找到所有双换行符
[\r\n][\r\n]
并用 -------placeholder--------
这样的占位符字符串替换它们。别担心,该占位符将恢复为段落之间的 space。
- 既然我们知道了段落分界符的位置,就可以安全地删除所有换行符了。将
[\r\n]
替换为空。
- 现在整个文档应该只有一行文本,并用占位符字符串代替段落分隔符。
- 将
-------placeholder--------
替换为双换行符 [\r\n][\r\n]
- 完成!
但我很好奇:有没有办法用更少的步骤做到这一点?例如,在正则表达式中可以说 "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)
我经常从 PDF 或类似文件中复制文本,而换行符不是我想要的。我希望每个段落都是一行文本,而不是每个段落中有很多短行,段落之间有一个空行。
感谢这里的其他答案,我只需几步就可以用正则表达式解决这个问题:
- 找到所有双换行符
[\r\n][\r\n]
并用-------placeholder--------
这样的占位符字符串替换它们。别担心,该占位符将恢复为段落之间的 space。 - 既然我们知道了段落分界符的位置,就可以安全地删除所有换行符了。将
[\r\n]
替换为空。 - 现在整个文档应该只有一行文本,并用占位符字符串代替段落分隔符。
- 将
-------placeholder--------
替换为双换行符[\r\n][\r\n]
- 完成!
但我很好奇:有没有办法用更少的步骤做到这一点?例如,在正则表达式中可以说 "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)