使用Regex清理Linebreaks

时间:2015-01-19 16:10:16

标签: regex sublimetext

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

感谢此处的其他答案,我可以通过几个步骤解决这个问题:

  1. 找到所有双重换行符[\r\n][\r\n],并将其替换为占位符字符串-------placeholder--------。别担心,占位符会回到段落之间的空间。
  2. 既然我们知道段落的所在地,那么摆脱所有换行是安全的。无所事事地替换[\r\n]
  3. 您现在应该为整个文档添加一行文本,并使用占位符字符串代替段落分隔符。
  4. 使用双线换行-------placeholder--------
  5. 替换[\r\n][\r\n]
  6. 完成!
  7. 但我很好奇:有没有办法用更少的步骤做到这一点?例如,在正则表达式中是否可以说“查找所有换行符,除了换行符对,并替换为空”?这将消除占位符步骤的需要。

2 个答案:

答案 0 :(得分:1)

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

例:
这是第.\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: '$1 $2'

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

答案 1 :(得分:0)

好的,我可以告诉你它如何仅适用于\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