【问题标题】:Regex to find and remove newlines between Jekyll frontmatter (---)正则表达式查找和删除 Jekyll frontmatter 之间的换行符 (---)
【发布时间】:2019-10-19 13:43:12
【问题描述】:

开始研究正则表达式,我知道一些基础知识,但现在我尝试使用正则表达式从许多 Jekyll 降价文件中删除类别和子类别。我成功删除了两个类别行,但还剩下一些空白行 (\n)。

我想删除连字符 (---) 之间的空白行。

当前状态如下所示(3 种可能的状态):

---
title: safdsdf


---

---
title: safdsdf


toc: 
---

---
title: safdsdf


toc:
redirect_from: 
---

使用(?!-\n)(\w) 我找到了文本,但我不能只得到换行符。 (?!-{3}\n)(\n\n) 给我整个文档的所有换行符。 正则表达式对我来说超级难,非常感谢任何帮助。

【问题讨论】:

  • 尝试使用2个捕获组(^---(?:\r?\n(?!--|\s*$).*)*)\s*((?:\r?\n(?!---).*)*\r?\n---$)regex101.com/r/gDWCdw/1

标签: regex


【解决方案1】:

对于这 3 种可能的状态,您可以在捕获组中捕获开头 --- 和以下非空行。

然后匹配从新行开始的空白字符,并在第 2 组中捕获非空行,直到结束 ---

^(---(?:\r?\n(?!--|\s*$).*)*)\s*((?:\r?\n(?!---).*)*\r?\n---)$
  • ^ 字符串开始
  • ( 捕获第 1 组
    • --- 字面匹配
    • (?:非捕获组
      • \r?\n 匹配换行符
      • (?!(?:---|\s*)$) 如果右边不是 --- 或者只有空格字符
      • .* 匹配除换行符以外的任何字符 0+ 次
    • )*关闭非捕获组并重复0+次
  • )关闭第一组
  • \s* 匹配 0+ 次空格字符
  • ( 捕获第 2 组
    • (?:非捕获组
      • \r?\n 匹配换行符
      • (?!---$)如果右边不是---
      • .* 匹配除换行符以外的任何字符 0+ 次
    • )*关闭无捕获组并重复0+次
  • \r?\n--- 匹配换行符和 ---
  • )关闭第二组
  • $ 字符串结束。

Regex demo

在替换中使用 2 个捕获组

$1$2

【讨论】:

    【解决方案2】:

    试试这个:

    搜索:(\n){2,}

    替换:\n

    \n 是换行符

    (){2,} 表示两次或多次(括号只是封装了多个字符,以便花括号起作用。

    根据您的操作系统,您可能需要调整换行符。例如,Windows 使用\r\n

    【讨论】:

    • 这将在任何地方删除 2 个或更多换行符,他们只想在连字符行之间删除它们。
    • 啊,我明白了。我不明白这是一个要求。太简单了,我猜。
    猜你喜欢
    • 2016-12-31
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多