TL;DR:如何获取一系列以逗号分隔的键值对,但前提是它们以特定字符串开头?
你好,
我有一种情况,我有一个包含多行的文本块,每一行都可以有任意数量的键值对。
键和值以冒号分隔,然后每一对以逗号分隔。这些行以一个特定的键值对开始,其中一些需要被捕获,而另一些则被忽略。其他行没有任何键值对,但可能包含可能混淆 Regex 字符串的冒号和逗号。
以下是任务的一些参数/限制:
- 这些值将以逗号分隔,需要被捕获,而不仅仅是匹配
- 每个逗号分隔的值都有一个冒号对,需要以 KEY:VALUE 格式进行分组,其中 KEY 始终为第 1 组,VALUE 始终为第 2 组
- 正则表达式不得越过换行符
- 不允许使用 PHP、SED、AWK、Python、PERL 等编码,只能使用 PCRE2 正则表达式
- 可能有任意数量的对,以及需要捕获的任意数量的行
这是示例文本:
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
我需要捕获并分组Steps、Model和Mirror Mode的行,但忽略Prompt、Negative Prompt和Template
期望匹配:
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 ,没有编程工具,没有应用程序等。
这是一个使用 PCRE2 风味的解决方案:
匹配未知数量的匹配的关键是
\G
从最后一个匹配位置重新开始匹配。演示与解释