【问题标题】:Match inclusive between start and end over multiple lines在多行的开始和结束之间匹配包含在内
【发布时间】:2017-03-04 17:12:05
【问题描述】:

我有大量的 Toml 文件,其中一些包含我想删除的参数。我很难构建一个匹配起始文本categories = 和结束文本] 的正则表达式。根据下面的示例,我的正则表达式匹配开始和结束文本之间的文本,但不包括开始和结束文本本身。如何修改正则表达式以捕获开始和结束文本之间的所有内容?

我当前的正则表达式是:(?<=categories)(.*)(?=])

示例 .toml 包含:

+++
slug = "twenty-years-from-now-you-will-be-more"
description = ""
tags = [
  "Quoteoftheday",
  "Quote",
]
categories = [
  "Quoteoftheday",
  "Quote",
]
date = 2014-01-16T07:13:10-08:00
title = "twenty years from now..."
draft = false

+++

我想用正则表达式捕获的文本是:

categories = [
  "Quoteoftheday",
  "Quote",
]

示例代码是here.

【问题讨论】:

    标签: regex


    【解决方案1】:

    使用否定字符类,您可以使其在没有 DOTALLs 标志的情况下工作,以便它可以与不支持 DOTALL 的风格(如 Javascript)一起工作。

    \ncategories([^]]*)\]
    

    RegEx Demo


    要使其与sed 一起使用,请使用以下命令:

    sed -i.bak '/^categories[ \t]*=/,/\]/d' file
    
    cat file
    
    +++
    slug = "twenty-years-from-now-you-will-be-more"
    description = ""
    tags = [
      "Quoteoftheday",
      "Quote",
    ]
    date = 2014-01-16T07:13:10-08:00
    title = "twenty years from now..."
    draft = false
    
    +++
    

    【讨论】:

      【解决方案2】:

      尝试使用以下正则表达式

      (?s)categories[\s=\[]+(.*?)]
      

      说明

      • (?s) 单行标志/修饰符
      • categories[\s=\[]+ 匹配“类别”和任何空间实例 = [
      • (.*?)] 匹配任意字符和]

      DEMO

      【讨论】:

      • 这会产生一个很好的匹配,您将如何构造一个 sed 命令来从目录中的一组文件中删除该匹配的所有实例?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      相关资源
      最近更新 更多