[ID CS4-CS6] Возможна ли замена

Elsynor

Tesseract
Топикстартер
12 лет на форуме
Сообщения
1 282
Реакции
1 377
(?<=[А-Я]\.) ?(?=[А-Я]\.) Если находит ничего, то не заменяет. Возможно ли заменить (вставить)?
 

К.Т.

Участник
Сообщения
324
Реакции
337
Нельзя заменить ничего на что-то.
В таких случаях приходится захватывать выражением символы перед и|или после, а в замене использовать $1 и т.п.
 
  • Спасибо
Реакции: Elsynor

kstati

иɯɐɯɔʞ
10 лет на форуме
Сообщения
1 138
Реакции
512
Очевидно, что речь про инициалы. Такое правило даст неразрывный пробел в однобуквенных инициалах
И.М.Ярек
=>
И.[nbsp]М.[nbsp]Ярек
Код:
search:
(?<=[[:upper:]]\.)\s?([[:upper:]])
replace:
~S$1
То есть возможный пробел и заглавная, идущие после заглавной с точкой, меняются на неразрывный пробел и найденную справа заглавную.
 
Последнее редактирование:

Elsynor

Tesseract
Топикстартер
12 лет на форуме
Сообщения
1 282
Реакции
1 377
Вот в том то и дело: нужно присвоение No Break стиля, и сбрасываются италики и болды на последующей букве, приходится в два прохода.
 

kstati

иɯɐɯɔʞ
10 лет на форуме
Сообщения
1 138
Реакции
512
Вот в том то и дело: нужно присвоение No Break стиля, и сбрасываются италики и болды на последующей букве, приходится в два прохода.
Замена стиля - это уже замена
решение в лоб:
Код:
[А-Я]\.\s?[А-Я]\.
То есть захватывать всю строку - не использовать поиск вперед-назад (?<=)(?=)
Так задача решается?
Или же ты хочешь две разных замены стилей? Тогда нужно и два последовательных поиска.
 
Последнее редактирование:

Elsynor

Tesseract
Топикстартер
12 лет на форуме
Сообщения
1 282
Реакции
1 377
А.Н.Толстой
С сохранением стилизации всей конструкции, но с присвоением стиля Но Брейк вставляемым пробелам. Вот и всё.
Думал есть какой, не известный мне, переключатель в Грепе, нет, ну и…, будем по старинке.
Если у тебя там случайно регуляр стоит
Андрюх, при перприсвоении парастиля умрёт локальное форматирование '))'
 
Последнее редактирование:

kstati

иɯɐɯɔʞ
10 лет на форуме
Сообщения
1 138
Реакции
512
А.Н.Толстой
С сохранением стилизации всей конструкции, но с присвоением стиля Но Брейк вставляемым пробелам. Вот и всё.
Думал есть какой, не известный мне, переключатель в Грепе, нет, ну и…, будем по старинке.

Андрюх, при перприсвоении парастиля умрёт локальное форматирование '))'
120071

(?<=[[:upper:]]\.)\s?(?=[[:upper:]])

nobreak стиль подкрасил, зачеркнул и подчеркнул для наглядности)
 

Elsynor

Tesseract
Топикстартер
12 лет на форуме
Сообщения
1 282
Реакции
1 377
Так если нет пробела, он и не появится :(
 

veretragna

γνώσις
Сообщения
578
Реакции
200
Нужно два правила. Греп может выделить только один фрагмент текста за внутреннюю итерацию. Нельзя одним грепом обработать два несвязанных пробела.
Я бы сделал так:
Первый пробел:
(?<=[[:upper:]]\.)(\s)(?=[[:upper:]]\.)
Второй пробел:
(?<=[[:upper:]]\.\s[[:upper:]]\.)(\s)

@kstati ваш пример не совсем совершенен - будут попадания в тексте, где инициал только один. Например, "Встретимся в точке Б. Я зайду"
 

veretragna

γνώσις
Сообщения
578
Реакции
200
Так если нет пробела, он и не появится :(
Тогда не проще ли заменить точку на точку с неразрывным пробелом, без атрибута No Break? Если пробела нет, один греп не сможет и вставить пробел, и присвоить ему стиль, отличный от предыдущего символа
 

veretragna

γνώσις
Сообщения
578
Реакции
200
Так, есть проблема. \s не попадает в неразрывные пробелы, нужно как-то прикрутить проверку на \xA0
 

veretragna

γνώσις
Сообщения
578
Реакции
200
Первая точка с потенциальным пробелом:
(?<=[[:upper:]])\.(\s|\xA0?)(?=[[:upper:]]\.)
Вторая точка с потенциальным пробелом:
[[:upper:]]\.(\s|\xA0?)[[:upper:]]\K\.(\s|\xA0?)

Замена на:
.~S

Точка или точка с любым пробелом заменяется на точку с неразрывным пробелом. Стили не сбиваются
 

kstati

иɯɐɯɔʞ
10 лет на форуме
Сообщения
1 138
Реакции
512
@veretragna

Правильно использовать класс [[:space:]], а не мудрить с разными кодами символов.
 

veretragna

γνώσις
Сообщения
578
Реакции
200
Тем лучше:
(?<=[[:upper:]])\.[[:space:]]?(?=[[:upper:]]\.)
[[:upper:]]\.[[:space:]]?[[:upper:]]\K\.[[:space:]]?
@kstati да, сделаю закладку на другой справочник