我安装了settingslogic,并在配置文件中将正则表达式放入电子邮件中,如下所示: br />
#config/settings.yml
defaults: &defaults

  email_regex: /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i

development:
  <<: *defaults
  # neat_setting: 800

test:
  <<: *defaults

production:
  <<: *defaults


它有效,但是您对eval怎么看?将字符串转换为正则表达式的正确方法吗?

评论

您是否仅以电子邮件为例进行了选择,还是实际上将与电子邮件匹配的正则表达式模式作为可配置选项?如果是后者,请允许我问:为什么?您是否真的打算部署该应用程序的多个版本,这些版本需要以不同的方式匹配电子邮件?

对不起,我晚了回答,我在prj周围存储了几封电子邮件,并且我教给我一个单一的位置来存储所有电子邮件必须遵守的正则表达式,一个常数就足够了

解决方案是从yaml获取正则表达式,而如果将其放在常规字符串中,则可以帮助您stackoverflow.com/questions/4840626/…

对不起,我以后再回复。为了澄清,我在问为什么要在配置文件中完全设置它,而不是在有意义的代码中放置它-当然只有一次。例如。像这样:Email.valid?(string)

该字符串是在devise配置中读取的,它不是我自己的身份验证,因此我使用Settingslogic将我的所有配置存储在一个地方。

#1 楼

如果要在yaml文件中使用正则表达式,则需要使用!ruby/regexp

#config/settings.yml
defaults: &defaults

  email_regex: !ruby/regexp '/^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i'


编辑:
Mike Bethany提出的解决方案与yaml实现。

您可以在此处查看Ruby 1.9.2中使用的内容(搜索“!ruby / regexp”):
https://github.com/tenderlove /psych/blob/master/lib/psych/visitors/to_ruby.rb

PS(和OT):我认为,就像Mike Bethany一样,这个基本功能属于Regexp类而不是yaml,并且需要移至Regexp方法。你觉得呢?

#2 楼

我对使用eval来完成如此简单的任务并不感到疯狂,它既简单又有效,但是对我来说并不适合。这就像给您的格兰德印地汽车去一块面包。取而代之的是您可以执行以下操作。 /> PS Sinetris提出了更好的建议,就是在正则表达式之前添加!ruby/regexp并将其用单引号括在settings.yml文件中。但这仍然不能解决RegExp类不能正确处理regex语句的字符串表示的问题,因此我将上述代码留给任何想在YML文件之外进行的人。

评论


\ $ \ begingroup \ $
我对所有内容都表示同意,并且顺便感谢您的编辑,那么您将把该功能放在哪里重复使用?
\ $ \ endgroup \ $
–生态
2011年1月22日23:16

\ $ \ begingroup \ $
反正有点冗长...
\ $ \ endgroup \ $
–生态
2011年1月22日23:17

\ $ \ begingroup \ $
Regexp类中没有这种基本功能,这几乎是犯罪的,所以我会猴子将其修补到其中。我将使用新的函数名称,例如Regexp#new_from_string或您认为听起来最好的任何名称。 (我刚刚添加了“ ruby​​”标签,因为它更多是Ruby问题而不是Rails问题)。
\ $ \ endgroup \ $
–迈克·伯大尼(Mike Bethany)
2011年1月23日在2:13

\ $ \ begingroup \ $
它可能不是课程的一部分,因为您可以在正则表达式本身之前添加(?xim)。猴子将新的构造函数修补到核心类中,因为默认值并不能满足您的期望(乍一看/有点麻烦)。
\ $ \ endgroup \ $
–伊芙
2011年1月27日在17:11

\ $ \ begingroup \ $
我想您可能没有去阅读实际的问题。否则,您的评论没有任何意义。该问题与正则表达式选项无关,只是将正则表达式的字符串表示形式转换为实际的正则表达式。我敢打赌,你现在觉得自己很疯狂吧?下次您可能会发现在评论前实际阅读整个问题是无益的。
\ $ \ endgroup \ $
–迈克·伯大尼(Mike Bethany)
2011年1月27日20:45



#3 楼

我一定不会在评论中加入正则表达式。这意味着它需要在两个地方进行更改,其中之一无关紧要,并且会产生误导。在email_regex的声明上添加注释,以解释其要过滤的内容。这样一来,如果更改了,所有更改的地方都将包含在内,并且易于查找。

#config/initializers/devise.rb
   # Regex to use to validate the email address
   config.email_regexp = eval Settings.email_regex 




# Email validation regex - <short explanation to taste>
email_regex: /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i 


如果那是检索设置的正确方法,则我认为代码没有可读性问题。 (我不是Ruby专家。)

评论


\ $ \ begingroup \ $
在设置之前,注释是旧代码,我留在那里,以防万一我不得不回到旧解决方案,对了,我会删除它或对其进行更好的注释。
\ $ \ endgroup \ $
–生态
2011年1月22日19:34

#4 楼

如果要避免评估,可以。这是一个小技巧,但是可以确定的是,在您的设计中,在此代码之后有一个正则表达式:在您的情况下,不区分大小写。您只需要添加一个新设置,例如:

#config/initializers/devise.rb
# Regex to use to validate the email addres
# config.email_regexp = /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i
Setting.email_regexp[/\/(.*)\/(.?)/]  
config.email_regexp = x ; Regexp.new(/#{}/)


现在您只需要这样调用:

email_regexp_sensitive_case: true


就我而言,您一定要在email_regexp中有一个Regexp定义,而没有任何评估。

评论


\ $ \ begingroup \ $
但是您如何看待代码呢?我们应该注意什么(以这种方式使用eval)?因为现在,最初的实现是提供更高可读性的实现
\ $ \ endgroup \ $
–生态
2011年1月23日14:46



#5 楼

正如Sinetris提到的那样,YAML支持从字符串加载Regexp实例。

require 'yaml'
YAML.load('!ruby/regexp /abc/ix')
# => /abc/ix
YAML.load('!ruby/regexp /abc/ix').class
# => Regexp 


http://apidock.com/ruby/Regexp/yaml_new/class