【问题标题】:how to conditionally replace prefix or prefix/suffix gsub如何有条件地替换前缀或前缀/后缀 gsub
【发布时间】:2015-11-06 16:07:03
【问题描述】:

我有 2 个字符串需要 gsub:

前缀始终相同:例如 xxx 中间可以是hhhyyy

'xxx-hhh-111'
'xxx-yyy-aaa'

在这两种情况下我需要做的总是删除前缀:xxx 所以这工作正常:

'xxx-yyy-aaa'.gsub('xxx', '')

结果:

'-yyy-aaa'

但有时我需要检查正文是否为hhh,如果为真,则删除前缀和后缀(模式是后缀将是随机数字)

我想我可以用正则表达式完成这个,有什么想法吗?

所以当字符串为xxx-hhh-111 时我正在寻找的结果是:

'hhh'

简单的方法是 2 个语句,第一个语句总是删除我上面使用的 xxx

还有一个只是检查hhh 是否存在,如果存在则返回hhh ex:

if 'xxx-hhh-111'.include('hhh')
  'hhh'

但如果我可以用 1 条语句完成这两种情况,那就太好了...

【问题讨论】:

标签: ruby regex


【解决方案1】:

您可以依赖捕获组:您可以使用由括号分隔的捕获组之一,而不是用另一个替换匹配的字符串作为您正在寻找的结果。

"xxx-hhh-mmm".gsub /xxx-(hhh).*|xxx(.*)/, '\1' #=> 'hhh'
"xxx-yyy-mmm".gsub /xxx-(hhh).*|xxx(.*)/, '\1' #=> '-yyy-mmm'

'\1' 这里指的是第一个捕获组内的模式匹配:(hhh) 或 (.*)

【讨论】:

    【解决方案2】:

    1)

    data = [
      'xxx-hhh-111',
      'xxx-yyy-aaa'
    ]
    
    
    data.each do |str|
      p str.sub(/[^-]+(-([^-]+).*)/) {$2=='hhh' ? $2:$1}
    end
    
    --output:--
    "hhh"
    "-yyy-aaa"
    

    2)

    data = [
      'xxx-hhh-111',
      'xxx-yyy-aaa'
    ]
    
    data.each do |str|
      p str.include?('h') ? 'hhh' : str[3..-1]
    end
    
    --output:--
    "hhh"
    "-yyy-aaa"
    

    但如果我可以用 1 条语句完成这两种情况,那就太好了。

    为什么?

    【讨论】:

      【解决方案3】:

      你应该可以使用

      xxx(-hhh-|-\w{3}-.*).*
      

      并替换为第一个捕获组,即

      data.gsub(/xxx(-hhh-|-\w{3}-.*).*/, "\\1")
      

      其中数据是您的字符串。

      问候

      Example here

      编辑:注意到您不想要hhh 的连字符。使用

      xxx-?(hhh|-\w{3}-.*).*
      

      然后。 Example here.

      【讨论】:

        【解决方案4】:

        我们不要想太多:

        def extract(str, target)
          middle = str[4,3]
          middle == target ? middle : str[3..-1]
        end
        
        extract("cat-hhh-123", "hhh") #=> "hhh" 
        extract("cat-dog-123", "hhh") #=> "-dog-123" 
        

        【讨论】:

          猜你喜欢
          • 2017-11-05
          • 1970-01-01
          • 2021-10-30
          • 1970-01-01
          • 2010-10-25
          • 2021-06-25
          • 2023-03-24
          • 2017-01-23
          • 1970-01-01
          相关资源
          最近更新 更多