簡體   English   中英

如何使用 gsub 兩次?

[英]How to use gsub twice?

我需要執行搜索和替換活動

  1. "{{content}}" => 替換。 (這是為了保持相同的類型)正則表達式 gsub(/"{{(.*?)}}"/)
  2. "hello {{content}}" => repalce(從字符串替換)正則表達式 gsub(/{{(.*?)}}/)

我建立的方法是

def fill_in(template)   
      template.gsub(/\"\{\{(.*?)\}\}\"/) do
        "test"   
      end 
end

試過template.gsub(/\"\{\{(.*?)\}\}\"/).gsub(/\{\{(.*?)\}\}/) do ,但這給了我錯誤

#<Enumerator: "{{user_name}}":gsub(/"{{(.*?)}}"/)> 的未定義方法 `gsub'

如果第一個 gsub 與該模式匹配則優先,如果不匹配則檢查第二個 gsub

template.gsub(/\"\{\{(.*?)\}\}\"/) do
   # content will be replaced from the data object          
end.gsub(/\"\{\{(.*?)\}\}\"/) do
   # content will be replaced from the data object  
end

兩個 gsub 的 do body 是相同的,如何停止這種重復

gsub僅將正則表達式作為返回Enumerator的單個參數,因此您無法以這種方式鏈接gsub

您可以將兩種模式合二為一:

/(")?\{\{(.*?)\}\}(?(1)"|)/

請參閱正則表達式演示 細節:

  • (")? - 捕獲第 1 組(可選):
  • \{\{ - {{文本
  • (.*?) - 捕獲第 2 組:除換行符以外的任何零個或多個字符,盡可能少(如果您也需要匹配換行符,請改用((?s:.*?)) ,或者只需添加/m標志)
  • \}\} - }}字符串
  • (?(1)"|) - 條件構造:如果第 1 組匹配,則匹配" ,否則匹配空字符串。

在代碼中,您需要檢查第 1 組是否匹配,如果匹配,則執行一個替換邏輯,否則,使用另一個替換邏輯。 請參閱Ruby 演示

def fill_in(template)   
    template.gsub(/(")?\{\{(.*?)\}\}(?(1)"|)/) { 
        $~[1] ? "Replacement 1" : "Replacement 2" 
    }
end

p fill_in('"{{hello}}" and {{hello}}')
# => "Replacement 1 and Replacement 2"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM