匹配 YAML Frontmatter 的多行正则表达式,只有第一个匹配项,只有在前面只有空格时

问题描述 投票:0回答:2

问题

问题描述简单;我有一堆文本文件,我希望从中单独提取前面的内容(描述为匿名),如果有的话,然后停止进一步处理文件。

这是一个带有 frontmatter 的文件的有效示例;我的评论(假设在文件中不可见)将采用 C 风格的评论:


      /*spaces & newlines are fine*/

---     /* i.e., /^---\s*$/ */
key: value
foo: bar, zip, grump
/*
Anything can go in here, once I have this section pulled out, the yaml schema
can do the reset.  All that's important to note is that this section must be
terminated explicitly with a subsequent /^---\s*$/ in order to be deemed valid.
---

Anything else can follow here, more accidental frontmatter blobs can exist,
but it should not matter since the other requirement is that the regex engine
will cease processing beyond the termination of the first match.

到目前为止,我没有解决某些边缘情况的是,使用

ripgrep
/
rg
:

rg -g '!**/{node_modules,.*}/*' -g '*.md' -U '(?s)\s*^---$((?!---).*)^---$' -r '$1'

上面现在的问题是它在某些情况下匹配远远超过第一个终止

---
,例如你有两个 frontmatter blob,一个接一个。

奖金问题

  • 我想知道如何使用
    rg
    默认的标准正则表达式引擎来做到这一点,但也想知道如何使用
    PCRE2
    (
    -P
    )
  • 我想知道如何将所有标志嵌入正则表达式本身,而不是将
    -U
    用于多行,例如使用
    (?m)
regex pcre multiline pcregrep ripgrep
2个回答
0
投票

解决你的主要问题我相信这足以让你的匹配器变得懒惰。

此外,负面前瞻在这里是多余的(并且使用有点错误,最后更多)。

(?s)\s*^---$(.*?)^---$

我相信这个正则表达式应该适用于 pcre2 和默认值,因为它不使用环视。但我不完全确定默认引擎和

(?s)
.

至于

-U
,我相信它会改变应用程序在读取文件方面的行为,因此您不太可能放弃它。

负前瞻

看起来你试图禁止在匹配块中出现任何

---
。如果是这种情况,应该用这样的构造来完成:
((?!---).)*


0
投票

您的模式

(?s)\s*^---$((?!---).*)^---$
匹配太多,因为您使用
(?s)
必须点匹配换行符,并且您使用
.*
将首先匹配到最后,然后回溯以适应
^---$
部分

您可以使用经过调和的贪婪标记来编写模式,在这种情况下重复非捕获组inside捕获组,但是note这部分

(?!---)
不允许在它们之间有任何3个连续的连字符。由于前导空白字符是可选的,您可以省略它们。

(?s)^---$((?:(?!---).)*)^---$

正则表达式演示


你可以在没有

(?s)
的情况下使用负前瞻来编写模式(也许你必须对多行使用
(?m)
但我不确定ripgrep)

使用 pcre 和

\R
来匹配换行符:

^---((?:\R(?!---$).*)*)\R---$

说明

  • ^
    字符串开始
  • ---
    字面匹配
  • (
    捕获组 1
    • (?:\R(?!---$).*)*
      匹配整行如果不是
      ---
  • )
    关闭捕获组
  • \R---$
    匹配一个 unicode 换行符序列,
    ---
    并断言字符串的结尾

正则表达式演示

如果您只想使用 pcre 进行匹配,您也可以选择

\K
来忘记到目前为止匹配的内容,以及 所有格量词.

在最后使用前瞻意味着它将断言(不匹配)尾随

---

^---\K(?:\R(?!---$).*)*+(?=\R---$)

正则表达式演示

© www.soinside.com 2019 - 2024. All rights reserved.