正则表达式:替换捕获组中的字符

j.c*_*j.c 5 regex capturing-group

编辑

在正则表达式中,匹配的捕获组是否可以替换为相同的匹配更改(将一个字符替换为另一个字符)?

原问题

我正在将产品列表转换为 CSV 文本文件。列表中的每一行都有:number name[ description] price格式如下:

1 PRODUCT description:120
2 PRODUCT NAME TWO second description, maybe:80
3 THIRD PROD:18
Run Code Online (Sandbox Code Playgroud)


生成的格式还必须包含一个slug(而-不是)作为第二个字段:

1 PRODUCT:product-1:description:120
2 PRODUCT NAME TWO:product-name-two-2:second description, maybe:80
3 THIRD PROD:third-prod-3::18
Run Code Online (Sandbox Code Playgroud)

我正在使用的正则表达式是这样的:

(\d+) ([A-Z ]+?)[ ]?([a-z ,]*):([\d]+)

替换字符串是:

`\1 \2:\L$2-\1:\3:\4
Run Code Online (Sandbox Code Playgroud)

这样我的结果是:

1 PRODUCT:product-1:description:120
2 PRODUCT NAME TWO:product name two-2:second description, maybe:80
3 THIRD PROD:third prod-3::18
Run Code Online (Sandbox Code Playgroud)

-我错过的是第二个字段中需要的分隔符连字符,即\2用“ -”而不是“ ”进行分组。
是否可以使用单个正则表达式,或者我应该进行第二遍?

(目前我使用 Sublime 文本编辑器)

谢谢。

Seb*_*ske 0

我认为一次性完成此操作是不合理的,甚至可能是不可能的。要用连字符替换空格,您将需要多次传递或使用连续匹配,两者都会丢失重新排列结构所需的捕获组的上下文。因此,在第一次替换后,我会搜索(?m)(?:^[^:\n]*:|\G(?!^))[^: \n]*\K 并替换为-. 我不确定 Sublime 是否默认使用多行修饰符,你可能会删除(?m)then。

如果您使用一种支持正则表达式替换操作的回调函数的编程语言,那么答案可能会有所不同,您可以在该函数内进行替换-