2016-12-31 56 views
2

Stackvoverflow上的第一次,所以希望我能夠儘可能清楚地發佈這個正確的&。請隨意將此分開,並讓我知道如果需要將來如何發佈更清晰的問題。Ruby - 如果實例不匹配,則替換字符串中的單詞

新手到紅寶石在這裏,練習我可以在哪裏。

我想知道如何在ruby中替換字符串中的實例。

例如:

說我有:

string = 'richard julie richard julie sam letty sam letty' 

我怎麼會替換任何實例的字符串,不等於「理查」或「朱莉」 &字理查德更換一次?

因此新的字符串將讀取後說紅寶石方法實現:

string = 'richard julie richard julie richard richard richard richard 

我曾嘗試使用GSUB像這樣:

def string_replace(str) 
    if str.include?("sam" || "letty") 
    str.gsub! "sam" && "letty", "richard" 
    end 
end 

我已經知道有很多的問題,這嘗試;

  1. 當使用布爾運算符時,只有一個參數得到評估!任何人都可以闡明爲什麼?這也意味着當我需要'sam'&'letty'替換爲'richard'時,只有一個詞正在被替換。

  2. 此嘗試也非常有限,因爲它只會替換那些字符串sam & letty出現的那些實例。有沒有更好的方法可以涵蓋任何不等於理查德或朱莉被再次替換爲理查德這個詞的單詞?

任何可以給予的幫助將不勝感激。

謝謝&新年快樂。

P.s我該如何使用back tick逃生功能,以便我可以打印灰色塊來將它整理好?謝謝

+0

For _P。 S._問題,只需檢查我的編輯。 – mudasobwa

+0

'string.split.map {| w | w!=「richard」&& w!=「julie」? 「richard」:w} .join('')' –

+0

@ sagarpandya82不錯的答案 - 謝謝,但在下面標記爲更簡潔易懂的ReggieB解決方案。再次感謝。 –

回答

2

這是一個gsub,我認爲會做你想要什麼:

string = 'richard julie richard julie sam letty sam letty' 

string.gsub /\b(?!(richard|julie))\w+/, 'richard' 

\ba word break?!(richard|julie)是不是richard也不julie一個look ahead。所以這基本上是一個字符和它後面的字母,在這些字母不匹配richard也不julie

+0

嗨@ReggieB - 我接受了所有其他答覆中的答案(因爲他們都作爲解決方案!),但你的是最好的解釋和最容易理解,尤其是我是新的理解紅寶石和正則表達式 - 非常感謝你! –

+0

@kc不客氣。 – ReggieB

1

對於點1,include?不採用布爾表達式只是一個真值。如果你傳遞一個布爾表達式,它將返回turthy值。

"sam" && "lenny" # => "lenny" 
"sam" || "letty" # => "sam" 

對於第2點,這將取代不richardjulie任何字。在這裏你的困惑的

def string_replace(string) 
    non_removed_words = ['richard', 'julie'] 
    words = string.split(' ') 
    words.map { |w| non_removed_words.include?(w) ? w : 'richard' }.join(' ') 
end 
1

部分原因是,你已經稍微誤解是什麼||&&運營商做。

||不是一種通用的方法,可以使用任意方法,例如include?和2個可能的值。這是一個運算符,表示如果||的任一側爲真,則整體表達式被認爲是真實的。這麼說來不串包括SAM或LETTY你需要全文寫出來這樣兩個條件:

if str.include?("sam") || str.include?("letty") 

同樣&&是檢查如果兩個2所表達的是真實的運營商,它不是可以用gsub!用你試過的方式替換2個不同的單詞。使用map

355E3b的辦法是更換詞的匹配特定的條件,以下拆分的一般方法爲單詞的列表,處理每個字,然後加入再聚首的好方法。你可能會發現有些混亂,但稍後會發現,會非常方便


的另一件事是,其他值都算的上是真與假,不只是字面truefalse。這是人們談論truthyfalsey時的意思。任何字符串是truthy,所以:

"sam" || "letty" # => "sam" 

「薩姆」是truthy所以沒有必要爲Ruby來看看第二個值要知道整個事情是truthy,所以它左側的價值。

"sam" && "lenny" # => "lenny" 

條件紅寶石需要先檢查左側,如果是那樣的truthy然後檢查的右手邊,以確定整個事情是truthy。所以在這種情況下,整體表達具有從右邊看的價值。

+1

嗨mikej - 這是非常有用和詳細的信息 - 非常感謝你的解釋!幫助我澄清了一些事情! –

+0

@kc酷!很高興它幫助:) – mikej

1

純的正則表達式的解決方案:

input = 'richard julie richard julie sam letty sam letty' 
left = %w|richard julie| 
subst = 'richard' 

input.gsub(/\w+/) { |m| left.include?(m) ? m : subst } 
#⇒ "richard julie richard julie richard richard richard richard" 
+0

嗨mudasobwa - 謝謝你這個 - 很好地工作。也謝謝你對我的編輯提供幫助 - 我基本上不需要背部蜱嗎?請接受upvote以獲得有關該解決方案的幫助。 :) –

3

另一個gsub,使用其中包含關鍵字「茱莉」值「朱莉」一個散列的匹配,和「理查德」:

string = 'richard julie richard julie sam letty sam letty' 
h = Hash.new{"richard"} 
h["julie"] = "julie" 

p string.gsub(/\w+/, h) # =>"richard julie richard julie richard richard richard richard" 
+0

這是迄今爲止最好的答案。 – mudasobwa

+0

嗨Steenslag - 感謝回覆 - 這個答案很好,並且作爲一個解決方案工作,但我努力去理解它,就像下面的ReggieB解釋一樣清晰。感謝你的寶貴時間。儘管如此,仍然給你一個upvote! :) –

相關問題