使用正则表达式查找句子中间回车

时间:2012-02-04 19:14:02

标签: regex replace

我对正则表达式很新,但到目前为止还喜欢它的力量。令人难以置信的是,尽管我的头脑很多。

我一直试图想出这个问题一段时间,根据我在线阅读的内容测试各种正则表达式。但我似乎错过了一些东西。

我在OpenOffice / LibreOffice中有一个很长的文档。作者使用了以下不良布局实践,我需要删除和/或纠正:

1)行前面的空格,用于缩进段落。

2)行尾的空格。不知道为什么他们在那里。

3)马车在句子中间返回以强行包裹(我猜)。我将这些称为“假CR”。基本上任何没有句子定义标点符号的CR(句号,问号,感叹号或其中任何一个带有“之后的”)在这种情况下都是“假CR”。如果在CR之前有适当的句子定义标点符号,那么我认为这是一个真正的CR,并且不希望将其删除。

我已经足够轻松地完成了#1和#2。但是#3让我很难过。

我设法将一些可以找到我想要的东西放在一起,但它会包括该行的最后一个字母,而不仅仅是CR。因此,即使是空的替换也会消除CR,但也是最后一个字母。

非常感谢任何帮助。

我用来执行这个正则表达式的软件是TextSoap(在Mac上)。据我所知,处理正则表达式是“正常”的方式,而不是在它上面有自己的不规则扭曲。

我实际上想在LibreOffice / OpenOffice上的Find-Replace中运行生成的正则表达式,但它不接受我抛出的任何标准正则表达式。它们在TextSoap中工作正常,但在OO / LO中没有结果。不知道为什么 - 似乎OO没有Regex的默认实现(或者我只是做错了)。因此,我目前正在将LibreOffice文档中的文本复制到文本soap中,将其整理出来并将其复制回来。

谢谢...

乔纳森

更新: 我应该提供一个例子(抱歉忘记这样做):

这里有一个示例:http://best-mac-tips.com/wp-content/uploads/example.txt

3 个答案:

答案 0 :(得分:2)

这个中间句子换行符的正则表达式应该在TextMate中起作用:

(?<![\s.?!]"|[\s.?!])\s+

TM的正则表达式功能由Oniguruma library提供,它将接受由两个或更多具有不同但固定长度的备选方案组成的后备。或者你可以使用它,它应该适用于支持lookbehinds的任何风格:

(?<![\s.?!]")(?<![\s.?!])\s+

替换字符串将是单个空格。这也将取代简单的空间,但这不会伤害任何东西。要摆脱前导和尾随空格,请使用此正则表达式:

^[ ]+|[ ]+$

......并将其替换为空。 (括号不是必需的,它们只是使它更容易阅读。)

答案 1 :(得分:0)

如果没有看到一个例子,我认为这可以找到任何不是句末的\ n或\ r \ n:

 (.+?)([\n\r]+)(.+?[\.\?\!]+)

我怀疑,将匹配组1和3与之间的空格组合将返回您想要的字符串。
(更新,因为出于某种原因我假设你使用的是python ......)

另一个更新:在第一个捕获组之前添加\ s *,在最后一个捕获组之后添加\ s *将过滤掉那些缩进/空格。

\ S *?(。+?)([\ n \ R] +)(。+?[\?] +)\ S *?

答案 2 :(得分:0)

您需要的是lookbehind assertion

s/(?<![.!?]"?)\n/ /

(注意我想你想用空格替换,或者两个空格,或者看起来很有趣)。

您可能也可以反向引用。