【问题标题】:How to use Ruby gsub with regex to do partial string substitution如何使用 Ruby gsub 和正则表达式进行部分字符串替换
【发布时间】:2019-08-28 11:46:50
【问题描述】:

我有一个带有一行的管道分隔文件

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|"

任何线索如何实现这一点?

【问题讨论】:

    标签: regex ruby gsub string-substitution


    【解决方案1】:

    如果字符串以 H 开头,您可以替换管道内第一次出现的 8 位数字

    s = "H||CUSTCHQH2H||PHPCCIPHP|1010032000|28092017|25001853||||"
    p s.gsub(/\A(H.*?\|)[0-9]{8}(?=\|)/, '\100000000')
    # 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 是对第 1 组中的值的替换反向引用

    【讨论】:

    • 谢谢@Wiktor Stribiżew 您能否详细说明“(?=\|)”。为什么没有添加到匹配值中
    • @Navi 它没有被添加到匹配值,因为它是一个不消耗文本的正向前瞻 - "lookaround 实际上匹配字符,但随后放弃匹配,只返回结果:匹配或不匹配。这就是为什么它们被称为“断言”。它们不消耗字符串中的字符,而只是断言匹配是否可能。“,请参阅更多关于lookaheads.
    猜你喜欢
    • 2015-11-30
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多