Вставка пробела между точкой и символом с помощью простого поиска / замены регулярными выражениями

Я хочу разделить предложения, вставляя пробел между каждым периодом и буквой, но не между чем-либо еще, например точкой и скобкой или точкой и запятой.

Учти это:

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

Это, вероятно, имеет какое-то решение в Perl или PHP, но что меня интересует, может ли это быть сделано в текстовом редакторе, который поддерживает поиск / замену на основе регулярных выражений? Проблема в том, что он будет соответствовать как точке, так и символу, а замена полностью уничтожит оба. Другими словами, есть ли способ сопоставить "ничто" между этими двумя персонажами?

4 ответа

Решение

Вы можете использовать обратные ссылки в строке замены. Обычно это будет выглядеть примерно так:

Поиск регулярного выражения:

(\.)(\w)

Замена шаблона (обратите внимание на пространство):

$1 $2

Обратные ссылки являются заменой для соответствующих групп.

В качестве альтернативы вы можете использовать lookarounds:

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

Это не "захватывает" текст, оно будет соответствовать только позиции между точкой и буквой / цифрой (строка нулевой длины). Замена этого, по сути, вставит некоторый текст.

Правда, это зависит от возможностей вашего текстового редактора. Очень немногие текстовые редакторы имеют встроенный движок регулярных выражений. Я использую TextPad, который имеет собственный вид регулярных выражений, который в основном не поддерживает обходные пути (что вынуждает меня использовать первый подход).

Язык не указан, и я использовал 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

В Perl:

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

В vim (весь файл):

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

В Visual Studio это было бы

\.([a-zA-Z])

в "Найти что", и

\. \1

в "Заменить на:".

Как правило, большинство редакторов, поддерживающих поиск по регулярным выражениям, обычно имеют группы захвата, которые позволяют вам сохранять совпадающую часть выражения и использовать ее в тексте замены. В выражениях выше всего в () "захвачен", и я включаю его с \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.

Другие вопросы по тегам