質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

1259閲覧

【正規表現】文字列の頭に空白があるor文字列の始まりの場合 という条件

gogoackman3

総合スコア109

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2016/11/10 09:09

編集2016/11/10 09:30

ハッシュタグを投稿された文字列から判別するための正規表現を作成しています。

現在は、以下の通り、先頭に
①【半角or全角スペース】があり
②その後に【半角or全角シャープ】があり、
③次の【半角or全角スペース】があるまでの文字列

をハッシュタグと識別しています。

/[ ][##][^ ]+/

しかし、これだと、以下のような投稿内容がハッシュタグのみの場合の先頭のハッシュタグが識別できません。

#そろそろ冬だね #みかん食べようよ #家族団欒

なので、①の部分を【半角or全角スペース】がある、または【テキストの頭】という条件にしたいのですが、その場合、前述の正規表現をどう変更すれば良いのでしょうか??

【追記】
発生したエラー

Processing by CommentsController#create as JS Parameters: {"utf8"=>"✓", "authenticity_token"=>"f7WmhzeqykQ5m4PP0i+3FfiU6NMOVzPX98rL+hclJIqtp+Rc9em7OywPX9QWcQiARnMH2uWb4mLQHxU865EFcQ==", "comment"=>{"text"=>"#hash #hash1 #hash2 ", "user_id"=>"30"}, "commit"=>"投稿", "post_id"=>"62"} User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 30 ORDER BY `users`.`id` ASC LIMIT 1 Post Load (0.3ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = 62 LIMIT 1 Game Load (0.3ms) SELECT `games`.* FROM `games` WHERE `games`.`id` = 5 LIMIT 1 Completed 500 Internal Server Error in 58ms (ActiveRecord: 0.9ms) NoMethodError (undefined method `gsub' for [""]:Array):

メソッド

def extraction_hashtag(string) string.scan(/(^|[ ])[##][^ ]+/).map{ |a| a.gsub(/[ ]/, "")} end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

( )を正規表現内で使うとその部分のみが取得されてしまうので(?:)にするといいです。

ruby

1def extraction_hashtag(string) 2 string.scan(/(?:^|[ ])[##][^ ]+/).map{ |a| a.gsub(/[ ]/, "")} 3end

と、いう事は ( ) の性質をうまく利用すれば

ruby

1def extraction_hashtag(string) 2 string.scan(/(?:^|[ ])([##][^ ]+)/).flatten 3end

でokですね。

投稿2016/11/10 09:58

hana-da

総合スコア1728

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gogoackman3

2016/11/10 10:29

hana-daさん、ありがとうございます!! 問題なく動きました。 ただ、今度は以下の、テキストの中からハッシュタグのみを消すメソッドで、なぜかハッシュタグ含め全てのテキストが消えてしまうようになりました・・・ def delete_hashtag(string) copy = string.dup copy.gsub!(/(?:^|[  ])([##][^  ]+)/,"") return end これは別の正規表現の書き方が必要なのでしょうか??
hana-da

2016/11/10 10:57

returnがいらないんじゃないですかね?
gogoackman3

2016/11/10 11:04

returnを消しても、そもそも copy.gsub!(/(?:^|[  ])([##][^  ]+)/,"") の段階で、なぜかcopyの値が全て空になってしまうので、同じエラーが発生してしまいます・・・。 でもありがとうございました。もう少し調べてみたいと思います。
gogoackman3

2016/11/10 11:09

そして、原因わかりました。ありがとうございました!
guest

0

先頭を示す^も、カッコの中に入れて選択に使うことができます。

/(^|[ ])[##][^ ]+/

投稿2016/11/10 09:15

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gogoackman3

2016/11/10 09:31

ありがとうございます!早速試したところ、追記させて頂いたようなエラーが発生しました。 前回までの正規表現ではエラーは発生しなかったのですが、何か書き方が悪いのでしょうか??
gogoackman3

2016/11/10 09:37

どうやら、 string.scan(/(^|[ ])[##][^ ]+/) の段階で値が全て空になっているようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問