【问题标题】:Can you put a variable in a regexp?你能把一个变量放在一个正则表达式中吗?
【发布时间】:2011-04-11 10:38:48
【问题描述】:

我正在尝试验证 Model.category 是否等于任何现有的类别名称

unless Category.exists?(:name => self.category.downcase)

我必须在其中输入小写字母以确保它们都被小写,以便它们可以匹配为字符串。但是更新属性 before_save 是一个很大的服务器命中,我正在考虑通过正则表达式匹配它们。像这样的

unless Category.exists?(:name => /#{self.category}/ }

有没有这样的可能?或者有更好的方法吗?

【问题讨论】:

  • 为什么在保存之前将属性小写会导致额外的服务器命中?

标签: ruby-on-rails ruby regex validation


【解决方案1】:

我不知道如何在 Ruby 中编程,但肯定可以通过将字符串与 regexp 与您的字符串连接然后运行 ​​regexp 来实现。

【讨论】:

  • 如何将 /i 不区分大小写选项添加到正则表达式?
【解决方案2】:
x = 'fluffy'
Regexp.new x.to_s

也许有更好的方法。

【讨论】:

  • ??我不明白,对不起。 :(
  • /expression/ 是Regexp 类的语法糖。使用后者,您可以显式创建一个新的正则表达式。所以Regexp.new(self.category, Regexp::IGNORECASE) 是你需要的(但你也可以使用字符串插值)。您可以在文档中找到更多信息。 ruby-doc.org/core/classes/Regexp.html
  • 感谢 Foatless。很好的建议:D 麻烦的是它返回一个正则表达式,而不是 var 小写。
  • 我不太明白。你想完成什么?
  • 我想将结果“JiMMy”返回为“jimmy”而不是“/JiMMy/”。
【解决方案3】:

是的,您可以在正则表达式中使用变量插值。

>> s = "thing"
=> "thing"
>> r = /#{s}/
=> /thing/

【讨论】:

  • 太棒了,你不会知道如何将不区分大小写的选项 /i 添加到你的正则表达式中吧?
  • 只需添加一个'i':r = /#{s}/i
  • 嗯.. 似乎所有这些插值只是返回一个正则表达式,而不是我想要的最终结果。
  • regxPlayerVariable = '(.*?)=.*?document\.getElementById(#{pluginPlayeVariable})' 我在上面应用了所有这些,但这些都不起作用
  • @SSP:字符串插值只出现在双引号字符串中。
【解决方案4】:

我无法理解您在降级方面的真正问题是什么,但我想您必须在比较之前先降级现有类别。我想正则表达式在这里不会有帮助,因为条件中的“=>”是精确区分大小写的比较(数据库中的默认值),并且 AR 不支持正则表达式。你应该换一种方式:

PostgreSQL:

books = Book.find :all, :conditions => [ "authors ILIKE ?", "smith" ]

Mysql:

author = "Smith".downcase
books = Book.find :all, :conditions => [ "LOWER(authors) LIKE ?", "#{author}" ]

或

books = Book.find :all, :conditions => [ "authors LIKE ? COLLATE utf8_general_ci", "smith"]

存在吗?方法应该与上面的 :conditions 参数一起使用。 如果这对您造成任何数据库命中,例如你有数百万个类别。然后,您应该使用小写名称创建单独的列,并将其与简单的“=>”条件进行比较。

【讨论】:

  • 谢谢,还要确保去掉开头和结尾的空格(String#strip 或 String#strip!),用户会输入很多奇怪的东西。
猜你喜欢
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 2018-01-13
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 2013-11-05
相关资源
最近更新 更多