如何使用 Ruby gsub 和正则表达式来进行部分字符串替换

How to use Ruby gsub with regex to do partial string substitution

我有一个竖线分隔的文件,其中有一行

H||CUSTCHQH2H||PHPCCIPHP|1010032000|28092017|25001853||||

如果第一个字符是 "H"

,我想用正则表达式“[0-9]{8}”替换日期 (28092017)

我尝试了以下示例来测试我的理解,我试图将 "a" 替换为 "i"。

str = "|123||a|"
str.gsub /\|(.*?)\|(.*?)\|(.*?)\|/, "\|\1\|\|\1\|i\|"

但这是给 o/p 作为 "|123||123|i|"

知道如何实现吗?

如果字符串以 H 开头,您可以使用

替换竖线中第一次出现的 8 位数字
s = "H||CUSTCHQH2H||PHPCCIPHP|1010032000|28092017|25001853||||"
p s.gsub(/\A(H.*?\|)[0-9]{8}(?=\|)/, '0000000')
# or
p s.gsub(/\AH.*?\|\K[0-9]{8}(?=\|)/, '00000000')

Ruby demo。此处,该值被 8 个零替换。

图案详情

  • \A - 字符串的开始(^ 是 Ruby 中一行的开始)
  • (H.*?\|) - 捕获第 1 组(使用 \K 的变体时不需要它):H 然后尽可能少的任何 0+ 个字符
  • \K - 丢弃到目前为止匹配的文本的匹配重置运算符
  • [0-9]{8} - 八位数
  • (?=\|) - 下一个字符必须是 |,但不会将其添加到匹配值中,因为它是不消耗文本的正前瞻。

第一个 gsub 中的 是对组 1 中值的 替换反向引用