web-dev-qa-db-ja.com

Rails 3-コントローラの正規表現を介して文字列/テキストに特定の単語/文字が含まれているかどうかを確認します

私は自分のアプリで引用メカニズムに取り組んでいます。たとえば、そのトピックのコメント26を引用するために、コメントフォームに#26を単に入力することが可能である必要があります。
ユーザーが最初に1つ以上のコメントを引用したいかどうかを確認するために、current_user.comments.buildの後、@ comment.saveの前にif条件を配置します。
しかし、私の質問をもう少し一般的で適応しやすくするために:

if @comment.content.include?(/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i)

このようなものが欲しい。この例は、コメントのコンテンツにメールが含まれているかどうかを確認するためのものです。しかし、論理的には「正規表現を文字列に変換できません」というエラーが発生します。

どのようにインクルードできますか? Rails with regexp?)のメソッドでは、テキストに特定の正規表現形式の文字列が含まれているかどうかを確認するには?

または、コントローラはそのような正規表現アクションの間違った場所ですか?

20

私はRuby正規表現をこのようにしています:

stringObj.match(/regex/)
46
Anna Billstrom

またあります

if @comment.content =~ /regex/

以前のすべてのコメント@prev_commentsの配列があり、それらをすべて一度に置き換えたい場合は、次のことができます。

pattern = /#(\d+)/

@comment.content.gsub(pattern) do 
  cur_match = Regexp.last_match
  idx = cur_match[1].to_i - 1
  @prev_comments[idx]
end

TrickはRegexp.last_matchを使用して現在の一致を取得しているため、スレッドセーフかどうか疑問に思いました。 is だそうです。

以下のより一般的な文字列拡張から適応(盗難)

class String
  def js_replace(pattern, &block)
    gsub(pattern) do |_|
      md = Regexp.last_match
      args = [md.to_s, md.captures, md.begin(0), self].flatten
      block.call(*args)
    end
  end
end

ソース: http://vemod.net/string-js_replace

9
Michael Dodge

.includeの性質に合わせるには?

 stringObj.match(/regex/).present?

Rails(またはActiveSupport)を使用している場合、同様の真/偽の結果が得られます

4
Carpela