TL;DR:如何获取一系列以逗号分隔的键:值对,但前提是它们以特定字符串开头?
你好,
我遇到的情况是,我有一个包含多行的文本块,每行可以有一个随意的其上的键值对的数量。
键和值以冒号分隔,然后每对以逗号分隔。行以特定的键值对开头,其中一些需要捕获,其他则忽略。其他行没有任何键值对,但可能有冒号和逗号,这可能会混淆正则表达式字符串。
以下是该任务的一些参数/限制:
- 这些值将以逗号分隔,需要捕获,而不仅仅是匹配
- 每个逗号分隔的值将有一个冒号对,需要以 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
我需要捕捉并分组这些线条脚步,模型, 和镜像模式但忽略迅速的,负面提示, 和模板
期望匹配:
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
从最后一个匹配的位置重新开始匹配。