регулярное выражение, как найти и заменить в нескольких экземплярах по многострочному поиску - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть следующий текст:

vyāsa-prasādāc chrutavānZKL
etad guhyam ahaṁ paramZKL
yogaṁ yogeśvarāt kṛṣṇātZKL
sākṣāt kathayataḥ svayamPXY

rājan saṁsmṛtya saṁsmṛtyaZKL
saṁvādam imam adbhutamZKL
keśavārjunayoḥ puṇyaṁZKL
hṛṣyāmi ca muhur muhuḥPXY

tac ca saṁsmṛtya saṁsmṛtyaZKL
rūpam aty-adbhutaṁ hareḥZKL
vismayo me mahān rājanZKL
hṛṣyāmi ca punaḥ punaḥPXY

yatra yogeśvaraḥ kṛṣṇoZKL
yatra pārtho dhanur-dharaḥZKL
tatra śrīr vijayo bhūtirZKL
dhruvā nītir matir mamaPXY

Теперь я хочу:

vyāsa-prasādāc chrutavānZKL
etad guhyam ahaṁ paramZKL
yogaṁ yogeśvarāt kṛṣṇāt sākṣāt kathayataḥ svayamPXY

rājan saṁsmṛtya saṁsmṛtyaZKL
saṁvādam imam adbhutamZKL
keśavārjunayoḥ puṇyaṁ hṛṣyāmi ca muhur muhuḥPXY

tac ca saṁsmṛtya saṁsmṛtyaZKL
rūpam aty-adbhutaṁ hareḥZKL
vismayo me mahān rājan hṛṣyāmi ca punaḥ punaḥPXY

yatra yogeśvaraḥ kṛṣṇoZKL
yatra pārtho dhanur-dharaḥZKL
tatra śrīr vijayo bhūtir dhruvā nītir matir mamaPXY

Я хочу объединить последние две строки в каждом разделе.

Iя пытаюсь в возвышенном тексте:

find: (?s)ZKL\n((?!.*ZKL).*PXY)
replace:  \1

(?s)  for multi line search
ZKL\n is ZKL and new line
((?!.*ZKL)  to search from ZKL which is before PXY otherwse there are many ZKL
.*PXY everything till PXY

выше будет заменить только последний экземпляр.Как увидеть, что все четыре экземпляра в четырех строфах заменены.

У меня много таких строф

Ответы [ 3 ]

0 голосов
/ 24 ноября 2018

Вы можете попробовать это:

ZKL\n(?=.*PXY\n\n)

Соответствует ZKL, за которым следует новая строка, а затем проверяет, есть ли набор символов, не являющихся символами новой строки, после которых следует PXY, за которыми следуют 2 новые строки после этого.

Вы можете заменить его пробелом.

Обратите внимание, что для того, чтобы это работало для последней строфы, вам нужно иметь как минимум две новые строки в конце файла.

Демо

0 голосов
/ 24 ноября 2018

Это регулярное выражение должно выполнять работу:

(.+ZKL\n.+ZKL\n.+ZKL)\n(.+PXY)

Регулярное выражение соответствует любому числу от any char до 'ZKL\n'.Это повторяется три раза и сохраняется в Group 1.

Затем оно соответствует любому числу любого символа до 'PXY' Это сохраняется в Group 2.

Теперь вы заменяете на:

$1$2 или на некоторых языках: \1\2

Это объединит последние две строки.

Вам следует установить флаг global.

0 голосов
/ 24 ноября 2018

Это регулярное выражение работает PCRE.Я не уверен насчет sublimetext3, вы можете попробовать это регулярное выражение?

ZKL\n(?=.*\n\n)

и заменить его только одним пробелом.

Примечание: я вставил две новые строки после последнего абзаца,так что регулярное выражение работает и для последнего абзаца.

Проверьте здесь

Редактировать: В случае, если вы хотите дополнительно объединить строку PXY с двумястрок над ним, вы можете использовать ZKL\n и заменить его пробелом.

Но если вы хотите объединить все четыре строки в одну висту, удалив ZKL и PXY в конце, вы можете использовать это регулярное выражение,

(ZKL|PXY(\n))\n

и удалите его с помощью \2\2

Демо

...