将所有换行符替换为不带有正则表达式的句点?

时间:2013-05-22 00:10:24

标签: regex

是否可以使用正则表达式仅选择不在句点之前的换行符? 我正在为学生编辑字幕文件。为了使打印版本死树友好,我试图用空格替换所有不带句点或问号的换行符。

选项1
选择所有不以句号开头的换行符或问号正则表达式[a-z]\n适用于此但当然它选择换行符前单词的最后一个字母。 - >是否有可能以某种方式保存并插入换行符之前的单词的最后一个字母,并使用正则表达式将其与空格一起插入,或者我必须为其编写脚本(例如php)

选项2
仅选择以字符开头的换行符。我试着调查看后面。

在写这个问题时,解决方案给我打了个电话。 要在字符前面选择换行符(?<=[a-z])\n,然后用空格替换。

我搜索了堆栈溢出,无法找到我想要的东西。我希望我不会在同一时间发布问题和解决方案而冒犯任何人。它可能在将来帮助其他人。

3 个答案:

答案 0 :(得分:1)

我最近遇到了这个问题,我是这样解决的:

搜索:

" $2"


(?<!\.|\?) -> There can't be ./?
(\r\n)+ -> one or more newlines 
([^?\.]+) -> selects everything of the new line except ?/. 

" $2" -> second capture group with SPACE before.

replace:(小心!有空格!!)

@mixin smoke($color, $l){
  background: scale-color($color, $lightness: $l)
}

我使用了 Regex Buddy,如果它对您不起作用,我可以尝试使用 Regex Buddy 将其转换为另一种编程语言。

答案 1 :(得分:0)

语法可能会有所不同,具体取决于您使用什么来替换文本(Java,Perl,PHP,sed,vi等)。

在Java中你可以试试这个:

str.replaceAll("([^\\.!?])\r?\n", "$1 ").replaceAll("  +", " ");

在perl:

perl -p -e 's/([^\.!?])\n/\1 /g; s/  +/ /g;' file.txt

您也可以阅读类似问题的答案:

How can I replace a newline (\n) using sed?

答案 2 :(得分:0)

让我们先定义换行符。在一些正则表达式中,Java 8 / PHP(PCRE),Ruby(Onigmo),您可以使用匹配任何换行符样式的\R速记字符类。在Java 8 regex reference, \R is defined中:

\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

现在,如果前面没有.字符,您希望找到此模式。您需要使用否定外观(?<!\.)。一旦在当前位置的左侧找到.,它就会失败。因此,以下是一些示例,说明如何删除某些语言中没有点前面的换行符:

  • PHP(demo):preg_replace('~(\.\R+)|\R+~', '$1', $s)
  • Java 7(demo):String rx_R = "(?:\\u000D\\u000A|[\\u000A\\u000B\\u000C\\u000D\\u0085\\u2028\\u2029])"; String res = s.replaceAll("(\\." + rx_R + ")|" + rx_R, "$1");
  • Ruby(demo):s.gsub(/(\.\R+)|\R+/, '\1')
  • C#(请参阅demo):var rx_R = @"(?:\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])"; var res = Regex.Replace(txt, $@"(\.{rx_R})|{rx_R}", "$1");
  • Python(2.x和3.x)(demo):rx_R = r'(?:\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])'然后re.sub(r'(\.{0})|{0}'.format(rx_R), lambda x: x.group(1) if x.group(1) else '', s)
  • JavaScript:它不支持lookbehind,因此,使用([^.]|^)捕获组和反向引用($1从替换字符串引用它)以保留除{{1换行前:

.