1

私は野心的すぎるか、これを行う方法はありますか

to add a string 存在しない場合は?

remove a the same string 存在する場合?

正規表現を使用してこれらすべてを実行し、ifelseステートメントを回避します

ここに例があります

私は文字列を持っています

"admin,artist,location_manager,event_manager"

したがって、上記の条件に関して、サブストリングlocation_managerを追加または削除できます。

基本的に、if elseステートメントを避けて、これらすべてを正規表現でわかりやすく行うことを目指しています。

"admin,artist,location_manager,event_manager".test(/some_regex/)

some_regexは、存在する場合は文字列からlocation_managerを削除し、存在しない場合は追加します。

私は野心を超えていますか

4

5 に答える 5

1

正規表現は、私が知っている言語で実際に何かを追加または削除することはありません。単に一致させるために使用されます。この機能を実現するには、他の言語構成(たとえば、正規表現ベースの置換関数)を使用する必要があります。それらのユーザーからの助けを得るために、あなたの特定の言語に言及することはおそらく助けになるでしょう。

于 2012-07-24T16:25:42.187 に答える
1

ある種のロジックを使用する必要があります。

str += ',location_manager' unless str.gsub!(/location_manager,/,'')

存在しない場合は、文字列の最後に追加すると思います

于 2012-07-24T17:47:18.313 に答える
1

これがちょっとした解決策です。正規表現は使用しませんが、if/elseステートメントも使用しません。制作に値するよりもアカデミックです。

前提条件:文字列はコンマで区切られたタイトルのリストであり、これらは一意のセット(重複なし)であり、その順序は重要ではありません。

titles = Set.new(str.split(','))
#=> #<Set: {"admin", "artist", "location_manager", "event_manager"}> 
titles_to_toggle = ["location_manager"]
#=> ["location_manager"]

titles ^= titles_to_toggle
#=> #<Set: {"admin", "artist", "event_manager"}>
titles ^= titles_to_toggle
#=> #<Set: {"location_manager", "admin", "artist", "event_manager"}>

titles.to_a.join(",")
#=> "location_manager,admin,artist,event_manager"

これはすべて、文字列を一種のセットとして使用していることを前提としています。もしそうなら、おそらくセットを使用する必要があります。そうでない場合で、実際に文字列操作関数を操作する必要がある場合は、if-else、または三項演算子などのバリアント、またはunless、Bergiの答えを使用する以外に方法はおそらくありません。

解決策としての正規表現についても注目に値します。エッジケースを考慮してください。'location_manager'が文字列の途中にある場合、余分なカンマを削除しますか?カンマが文字列の最初または最後にある場合、カンマの削除を正しく処理しますか?追加時にカンマを正しく追加しますか?これらの理由から、セットを文字列ではなくセットまたは配列として扱う方が理にかなっています。

于 2012-07-24T18:34:28.293 に答える
0

いいえ。正規表現は、「文字列」が存在するかどうか(または存在しないかどうか)のみを照合/テストできます。次に、使用した関数は、その結果に基づいて何かを実行できます。たとえばreplace、一致を削除できます。

ただし、2つのアクション(それぞれが正規表現で実行できます)を実行し、存在する場合は削除し、存在しない場合は追加します。それらは重複しているため、順番に実行することはできません。どちらか一方を実行する必要があります。ここでif-else構造(または三項演算子)が機能します。この仕事を正確に行うためにそれらを含むライブラリ/ネイティブ関数がない場合は、これらが必要です。Rubyに1つあるとは思えません。

if-elseステートメント(ワンライナーまたは式の場合)を避けたい場合は、三項演算子を使用できます。または、正しい値を返すlabda式を使用できます。

# kind of pseudo code
string.replace(/location,?|$/, function($0) return $0 ? "" : ",location" )

これは、文字列 " location"(オプションのコンマ付き)または文字列endと一致し、一致が見つかった場合は何も置き換えず、そうでない場合は文字列" ,location"を置き換えます。これをRubyに適応させることができると確信しています。

于 2012-07-24T18:15:14.417 に答える
0

パターンに一致するものを削除するのは本当に簡単です。

(admin,?|artist,?|location_manager,?|event_manager,?)

次に、一致を置き換える文字列(この場合は空の文字列)を選択し、すべてをreplaceメソッドに渡します。

あなたが提案した他の操作は、正規表現だけで達成するのはより困難でした。多分誰かがより良い答えを知っています

于 2012-07-24T16:25:54.373 に答える