Вставка пробела между точкой и символом с помощью простого поиска / замены регулярными выражениями
Я хочу разделить предложения, вставляя пробел между каждым периодом и буквой, но не между чем-либо еще, например точкой и скобкой или точкой и запятой.
Учти это:
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).
- (\w) соответствует ровно одному буквенно-цифровому символу перед точкой
- (.) соответствует точке
- (\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.