10

我想通过在每个句点和字母之间插入空格而不是在点和括号或点和逗号之间插入空格来分隔句子。

考虑一下:

This is a text.With some dots.Between words.(how lovely).

这可能在 Perl 或 PHP 中有一些解决方案,但我感兴趣的是它可以在支持基于正则表达式的搜索/替换的文本编辑器中完成吗?问题是它会同时匹配点和字符,而替换将完全消除两者。换句话说,有没有办法在这两个字符之间匹配“无”?

4

4 回答 4

16

您可以在替换字符串中使用反向引用。通常它看起来像:

搜索正则表达式:

(\.)(\w)

替换模式(注意空格):

$1 $2

后向引用是相应组的替身。

或者,您可以使用环视:

(?<=\.)(?=\w)

这不会“捕获”文本,它只会匹配句点和字母/数字(零长度字符串)之间的位置。替换它本质上会插入一些文本。

但实际上,这取决于您的文本编辑器的功能。很少有文本编辑器内置“完整”的正则表达式引擎。我使用 TextPad,它有自己的正则表达式风格,很大程度上不支持环视(迫使我使用第一种方法)。

于 2012-10-29T15:52:51.660 回答
2

未指明语言,我使用了 PHP,但表达式非常通用,可以在其他环境中重用:

<?php

$s = 'This is a text.With some dots.Between words.(how lovely).';
$r = '~(\w)(\.)(\w)~';

echo preg_replace($r, '$1 $3', $s);

此代码导致以下字符串输出:

This is a text With some dots Between words.(how lovely).
  1. (\w) 匹配点之前的一个字母数字字符
  2. (.) 匹配点
  3. (\w) 匹配点后的一个字母数字字符

第一个和第三个匹配在替换字符串中被称为 $1 和 $3

于 2012-10-29T15:40:38.613 回答
1

在 Perl 中:

$msg =~ s/\.([a-zA-Z])/\. \1/g

在 vim(整个文件)中:

:%s/\.([a-zA-Z])/\. \1/g

在 Visual Studio 中它会是

\.([a-zA-Z])

在“查找内容:”中,以及

\. \1

在“替换为:”中。

一般来说,大多数支持正则表达式搜索的编辑器通常都有捕获组,允许您存储匹配的部分表达式并在替换文本中使用它。在上面的表达式中, 中的所有内容()都是“捕获的”,我将其包含在\1.

于 2012-10-29T15:44:09.253 回答
1

这段代码解决了你的问题:

preg_replace('/([a-zA-Z]{1})\.([a-zA-Z]{1})/', '$1. $2', 'This is a text.With some dots.Between words.(how lovely).');

您应该检测点前后的任何字符并替换为 blanco。

于 2012-10-29T15:48:02.647 回答