【问题标题】:regex: substitute character in captured group正则表达式:捕获组中的替换字符
【发布时间】:2016-10-25 09:33:51
【问题描述】:

编辑

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

原始问题

我正在将产品列表转换为 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 文本编辑器)

谢谢。

【问题讨论】:

  • 我很确定你需要另一轮正则表达式来解决这个问题。
  • @Aaron 我也开始很确定了,如果你足够确定,添加一个答案,我会接受它;)

标签: regex capturing-group


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 2010-11-19
    • 2013-06-27
    • 2012-03-01
    相关资源
    最近更新 更多