正则表达式如何沿着多行搜索在多个实例处查找和替换

时间:2018-11-24 19:08:13

标签: regex sublimetext3

我有以下文字:

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

我想合并每个节的最后两行。

我正在尝试使用精美的文字:

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 :(得分:1)

您可以尝试以下方法:

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

它与ZKL匹配,后跟一个新行,然后检查是否存在一堆非换行字符,然后是PXY,然后是2个新行。

您可以将其替换为空格。

请注意,要使此节适用于最后一个节,您需要在文件末尾至少有两行新的行。

Demo

答案 1 :(得分:0)

此正则表达式似乎可以使用PCRE。我不确定sublimetext3,可以尝试使用此正则表达式吗?

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

并将其替换为一个空格。

注意:我在最后一段之后插入了两行,以便正则表达式也适用于最后一段。

Check here

编辑: 如果要进一步将PXY线与上方的两行合并,可以使用ZKL\n并将其替换为空格。

但是,如果您想将所有四行合并为一个,最后删除ZKL和PXY,则可以使用此正则表达式,

(ZKL|PXY(\n))\n

并用\2\2

将其删除

Demo

答案 2 :(得分:0)

此正则表达式应完成以下工作:

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

正则表达式匹配any char'ZKL\n'之间的任意数量。重复三次,并将其存储在Group 1中。

然后,它匹配'PXY'内的任意数量的任何字符,该字符存储在Group 2中。

现在您替换为:

$1$2或某些语言:\1\2

这将连接最后两行。

您应该设置global标志。