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

时间:2016-10-25 09:33:51

标签: regex capturing-group

修改

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

原始问题

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

1 PRODUCT description:120
2 PRODUCT NAME TWO second description, maybe:80
3 THIRD PROD:18


生成的格式还必须包含 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

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

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

和替换字符串是:

`\1 \2:\L$2-\1:\3:\4

这样我的结果就是:

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

我想念的是第二个字段中我需要的分隔符连字符-,即\2-而不是“”。
是否可以使用单个正则表达式,还是应该进行第二次传递?

(现在我正在使用Sublime文本编辑器)

感谢名单。

1 个答案:

答案 0 :(得分:0)

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

答案可能是另一个答案,如果您要使用编程语言,它支持正则表达式替换操作的回调函数,您可以在此函数中执行-替换。