仅使用 REGEX 对带有锚文本的多个键值对进行分组?

仅使用 REGEX 对带有锚文本的多个键值对进行分组?

TL;DR:如何获取一系列以逗号分隔的键:值对,但前提是它们以特定字符串开头?

你好,

我遇到的情况是,我有一个包含多行的文本块,每行可以有一个随意的其上的键值对的数量。

键和值以冒号分隔,然后每对以逗号分隔。行以特定的键值对开头,其中一些需要捕获,其他则忽略。其他行没有任何键值对,但可能有冒号和逗号,这可能会混淆正则表达式字符串。

以下是该任务的一些参数/限制:

  1. 这些值将以逗号分隔,需要捕获,而不仅仅是匹配
  2. 每个逗号分隔的值将有一个冒号对,需要以 KEY:VALUE 格式分组,其中 KEY 始终为第 1 组,VALUE 始终为第 2 组
  3. 正则表达式不能跨越换行符
  4. 不允许使用 PHP、SED、AWK、Python、PERL 等编码,只能使用 PCRE2 正则表达式
  5. 可以有任意数量的对,也可以有任意数量的行需要捕获

以下是示例文本:


Prompt: professional digital [airbrush:gouache:0.6] art of  (mythical:1.1) demon, wearing ragged jacket and pants, dynamic lighting, summer, Dutch Masters:0.6
Negative prompt: (child), (mangled hands), (badly drawn hands),( badly drawn fingers)
Steps: 70, Sampler: Euler a, CFG scale: 40, Seed: 351468770, Size: 340x512, Model hash: 2db4e932c1, Model: Comics_vimod, Denoising strength: 0.651,  
Mirror Mode: 2, Mirror Style: 0, Mirroring Max Step Fraction: 0.1, X Pan: 0.02, Y Pan: 0.03
Template: professional digital [airbrush:gouache:0.{6|7|8}] art of  ({fantastical|mythical}:1.1) demon, wearing ragged jacket and {skirt|pants|breech cloth|tuxedo}, dynamic lighting, {winter|summer}, Dutch Masters:0.6

我需要捕捉并分组这些线条脚步模型, 和镜像模式但忽略迅速的负面提示, 和模板


期望匹配:

Prompt: Don't match<br>
(Steps|70) (Sampler|Euler a) (CFG scale|40) (Seed|351468770) (Size|340x512) 
(Model hash|2db4e932c1) (Model|Comics_vimod) (Denoising strength|0.651)  
(Mirror Mode|2) (Mirror Style|0) (Mirroring Max Step Fraction|0.1) (X Pan|0.02) (Y Pan|0.03)<br>
Template: Don't Match

正则表达式代码尝试过:

(?:(?<=[,])|^)([^:,]+):([^,]+)... 匹配所需的内容,但也从中获取匹配项模板迅速的并且它跨越了换行符,因此模板与“步骤”分组
([^:\s]+):([^\s]+) ...仅匹配中的键值对迅速的模板由于括号和方括号
(?<pair>(?<key>.+?)(?::)(?<value>[^:]+)(?:,|$))...抓取的内容太多,不仅限于所需的行数

尝试使用主正则表达式前面的字符串进行捕获,如下所示:Mirror Mode: \d, (?<pair>(?<key>.+?)(?::)(?<value>[^:]+)(?:,|$))结果只有第一个 CSV 键:值对被分组

我将非常感激您的帮助。同样,这将在 Regex 中使用仅有的,没有编程工具,没有应用程序等等。等等。

答案1

以下是使用 PCRE2 风格的解决方案:

(^(?:Steps|Model|Mirror Mode)|\G(?!^).+?):\h*(.+?)(?:,\h*|$)   

匹配未知数量的匹配的关键是\G从最后一个匹配的位置重新开始匹配。

演示与说明

相关内容