代码之家  ›  专栏  ›  技术社区  ›  Santhosh

regex如何在多个实例中沿着多行搜索进行查找和替换

  •  0
  • Santhosh  · 技术社区  · 6 年前

    我有以下文字:

    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 回复  |  直到 6 年前
        1
  •  0
  •   Pushpesh Kumar Rajwanshi    6 年前

    这个regex似乎可以用pcre。我不确定Sublimetext3,你能试试这个regex吗?

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

    用一个单独的空间替换它。

    注意:我在最后一段后面插入了两行新行,这样regex也适用于最后一段。

    Check here

    编辑: 如果要进一步组合上面两行的pxy行,可以使用 ZKL\n 用空间代替它。

    但是如果你想把这四行合并成一行,在最后去掉zkl和pxy,你可以使用这个regex,

    (ZKL|PXY(\n))\n
    

    然后用 \2\2

    Demo

        2
  •  1
  •   Sweeper    6 年前

    您可以尝试以下操作:

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

    它匹配zkl后面跟着一行新行,然后检查是否有一组非新行字符,后面跟着pxy,后面跟着2行新行。

    你可以用空格代替它。

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

    Demo

        3
  •  0
  •   Poul Bak    6 年前

    此regex应执行以下操作:

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

    regex匹配任何数量的 any char 高达 'ZKL\n' . 重复三次,存储在 Group 1 .

    然后它匹配任何字符的任何数目,直到 'PXY' 这个储存在 Group 2 .

    现在替换为:

    $1$2 或者在某些语言中: \1\2

    这将连接最后两行。

    你应该设置 global 旗帜。