2017-06-01 11 views
0

@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. [@Bob D](member:Bob D)のために、すべてのものを削除するような構造(のような配列の後paranthesisを削除します。 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]」をお読みください。あなたは正規表現を把握することはできませんか?さて、あなたが試したことを私たちに見せてください。ちょうどコードを投げ捨てるのではなく、正しいものにすることができます。それはあなたを助けるためにここにありますが、それは同じ問題を抱えて将来他の人を助けることです。しかし、あなたが試したことを見せなければ、それはできません。あなたの試みの証拠がなければ、あなたが試してみたことがないように見えます。 –

+0

なぜ「Bob D」を「Bob P」に変更していますか? brackesを取り除くためとして –

答えて

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" 

長く、またはより複雑なパターン、維持または更新するのが難しくなるほど、可能な限り小さくしてください。複雑なパターンを単純なものから構築することで、デバッグや拡張が容易になります。

関連する問題