2017-06-01 47 views
0

我在構建一個類似tweet的系統,其中包含@mentions和#hashtags。現在,我需要一個鳴叫會來這樣的服務器:從Rails中的字符串中刪除特定的正則表達式

hi [@Bob D](member:Bob D) whats the deal with [#red](tag:red) 

,並在數據庫中保存爲:

hi @Bob P whats the deal with #red 

我的代碼是什麼樣的流程在我的腦海中,但無法實現它的工作。基本上,我需要執行以下操作:

  1. 掃描字符串任何[@...](一個樣結構陣列,其具有@開始)
  2. 狀結構的陣列後刪除paranthesis(因此對於[@Bob D](member:Bob D),除去一切在paranthesis)
  3. 刪除周圍與@(意思是開頭的子串的括號中,刪除從[][@...]

我也將需要爲#做同樣的事情。我幾乎可以肯定,這可以通過使用正則表達式slice!方法來完成,但我真的很難提出需要的正則表達式和控制流。 我認爲這將是這樣的:

a = "hi [@Bob D](member:Bob D) whats the deal with [#red](tag:red)" 
substring = a.scan <regular expression here> 
substring.each do |matching_substring| #the loop should get rid of the paranthesis but not the brackets 
    a.slice! matching_substring 
end 
#Something here should get rid of brackets 

與上面的代碼的問題是,我想不通的正則表達式,並沒有擺脫括號。

+0

請閱讀「[mcve]」。你無法弄清楚正則表達式?那麼,向我們展示你的嘗試,以便我們能夠糾正它,而不是拋出代碼。 SO在這裏是爲了幫助你,但更多的是在未來幫助其他人類似的問題,但除非你展示你的嘗試,否則我們不能這樣做。沒有你的企圖的證據,看起來你沒有試圖讓我們爲你寫。 –

+0

你爲什麼要把''Bob D''改成''「Bob P」'? –

回答

1

此正則表達式應該爲此 /(\[(@.*?)\]\((.*?)\))/

工作,你可以使用這個rubular來測試它

的?在*使它非貪婪之後,所以應該抓住每場比賽

的代碼看起來像

a = "hi [@Bob D](member:Bob D) whats the deal with [#red](tag:red)" 
substring = a.scan (\[(@.*?)\]\((.*?)\)) 
substring.each do |matching_substring| 
    a.gsub(matching_substring[0], matching_substring[1]) # replaces [@Bob D](member:Bob D) with @Bob D 
    matching_substring[1] #the part in the brackets sans brackets 
    matching_substring[2] #the part in the parentheses sans parentheses 
end 
+0

作爲擺脫括號,.gsub!(「[」,「」).gsub!(「]」,「」)將工作,但它會刪除所有括號 –

0

考慮一下:

str = "hi [@Bob D](member:Bob D) whats the deal with [#red](tag:red)" 

BRACKET_RE_STR = '\[ 
       (
       [@#] 
       [^\]]+ 
      ) 
       \]' 
PARAGRAPH_RE_STR = '\(
       [^)]+ 
       \)' 


BRACKET_RE = /#{BRACKET_RE_STR}/x 
PARAGRAPH_RE = /#{PARAGRAPH_RE_STR}/x 
BRACKET_AND_PARAGRAPH_RE = /#{BRACKET_RE_STR}#{PARAGRAPH_RE_STR}/x 

str.gsub(BRACKET_AND_PARAGRAPH_RE) { |s| s.sub(PARAGRAPH_RE, '').sub(BRACKET_RE, '\1') } 
# => "hi @Bob D whats the deal with #red" 

的時間越長,或更復雜的模式,維護或更新就越困難,所以儘量保持它們的小。從簡單的模式構建複雜的模式,因此更容易調試和擴展。

相關問題