【问题标题】:Rails 3 - Check if string/text includes a certain word/character via regex in controllerRails 3 - 通过控制器中的正则表达式检查字符串/文本是否包含某个单词/字符
【发布时间】:2012-06-09 17:53:25
【问题描述】:

我正在我的应用程序中开发一种引用机制,应该可以在其中简单地键入 #26,例如,在评论表单中以引用该主题的评论 26。
为了首先检查用户是否想要引用一个或多个 cmets,我在 current_user.cmets.build 和 @comment.save 之前放置了一个 if 条件。
但是,只是为了让我的问题更笼统,更容易适应:

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

我想要这样的东西。该示例用于检查评论的内容是否包括电子邮件。但从逻辑上讲,我收到“无法将正则表达式转换为字符串”错误。

如何进行包含?带有正则表达式的rails方法?那么,要检查一个文本是否包含某种正则表达式格式的字符串呢?

或者控制器是此类正则表达式操作的错误位置?

【问题讨论】:

    标签: ruby regex ruby-on-rails-3 string


    【解决方案1】:

    我用这种方式做 ruby​​ 正则表达式:

    stringObj.match(/regex/)
    

    【讨论】:

      【解决方案2】:

      还有

      if @comment.content =~ /regex/
      

      如果您有一个包含所有先前 cmets @prev_cmets 的数组,并且想一次性替换它们,您可以:

      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

      【讨论】:

        【解决方案3】:

        为了匹配 .include 的性质?

         stringObj.match(/regex/).present?
        

        如果您使用 Rails(或 ActiveSupport),会给出类似的真/假结果

        【讨论】:

        • Ruby 匹配对象没有present?
        • 更新到需要使用 Rails 或 ActiveSupport 才能利用 present?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多