如何使用 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 中值的 替换反向引用 。
我有一个竖线分隔的文件,其中有一行
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
开头,您可以使用
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 中值的 替换反向引用 。