7

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

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

选项 2
仅选择前面有字符的换行符。我试着往后看。

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

我搜索了堆栈溢出,并没有真正找到我要找的东西。我希望我不会通过同时发布问题和解决方案来冒犯任何人。它可能会在将来帮助其他人。

4

3 回答 3

1

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

搜索:

"(?<!\.|\?)(\r\n)+([^?\.]+)"

替换:(小心!有空格!!)

" $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.

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

于 2021-02-13T21:09:58.300 回答
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

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

如何使用 sed 替换换行符 (\n)?

于 2013-05-22T15:51:11.383 回答
0

让我们先定义一个换行符。在某些正则表达式风格中,Java 8 / PHP (PCRE)、Ruby (Onigmo),您可以使用\R与任何换行符样式匹配的速记字符类。在Java 8 正则表达式参考中,\R定义为:

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

现在,如果它前面没有.char,你想找到这个模式。您需要使用否定的lookbehind , (?<!\.). .一旦在当前位置的左侧立即找到 a ,匹配失败。因此,以下是一些示例,说明如何删除某些语言中不带点的换行符:

  • PHP(演示):preg_replace('~(\.\R+)|\R+~', '$1', $s)
  • Java 7(演示):String rx_R = "(?:\\u000D\\u000A|[\\u000A\\u000B\\u000C\\u000D\\u0085\\u2028\\u2029])"; String res = s.replaceAll("(\\." + rx_R + ")|" + rx_R, "$1");
  • 红宝石(演示):s.gsub(/(\.\R+)|\R+/, '\1')
  • C#(见演示):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)(演示):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从替换字符串中引用它)来保留字符而不是.换行符之前:

var s = "Line1\u000D\u000A Line2\u000B Line3\u000C Line4\u0085 Line5\u2028 Line6\u2029 Line7";
var rx = /([^.]|^)(?:\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])/g;
console.log(s.replace(rx, '$1'));

于 2017-07-17T11:59:48.633 回答