如何将ruby regex翻译为javascript? – (?i-mx:..)和Rails 3.0.3

我使用validates_format_of方法来检查电子邮件格式:

validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[az]{2,})$/i 

我也使用livevalidation插件来validation表单,所以在我的代码我得到:

 (?i-mx:^([^@\\s]+)@((?:[-a-z0-9]+\\.)+[az]{2,})$) 

Javascript无法读取此正则表达式。 我如何或在哪里可以将此正则表达式更改为原始:

 /^([^@\s]+)@((?:[-a-z0-9]+\.)+[az]{2,})$/i 

Ruby和JavaScript正则表达式由具有不同function的不同引擎解析和执行。 因此,Ruby和JavaScript正则表达式之间存在细微差别,这些差异略微不相容。 如果您注意不直接翻译,您仍然可以在JavaScript中表示简单的Ruby正则表达式。

以下是客户端validation的作用 :

 class Regexp def to_javascript Regexp.new(inspect.sub('\\A','^').sub('\\Z','$').sub('\\z','$').sub(/^\//,'').sub(/\/[az]*$/,'').gsub(/\(\?#.+\)/, '').gsub(/\(\?-\w+:/,'('), self.options).inspect end end 

最近将路由检查器添加到rails中采用了类似的方法 ,可能更好,因为它避免了猴子修补:

 def json_regexp(regexp) str = regexp.inspect. sub('\\A' , '^'). sub('\\Z' , '$'). sub('\\z' , '$'). sub(/^\// , ''). sub(/\/[az]*$/ , ''). gsub(/\(\?#.+\)/ , ''). gsub(/\(\?-\w+:/ , '('). gsub(/\s/ , '') Regexp.new(str).source end 

然后将这些插入到您的javascript代码中,使用如下内容:

 var regexp = #{/^([^@\s]+)@((?:[-a-z0-9]+\.)+[az]{2,})$/i.to_javascript}; 

原因是您使用.to_s而不是.inspect转换正则表达式。 您需要在视图中使用.inspect来获取正确的格式。 以下是一些可以解释问题的示例代码:

 email = /^([^@\s]+)@((?:[-a-z0-9]+\.)+[az]{2,})$/i email.to_s #"(?i-mx:^([^@\\s]+)@((?:[-a-z0-9]+\\.)+[az]{2,})$)" email.inspect #"/^([^@\\s]+)@((?:[-a-z0-9]+\\.)+[az]{2,})$/i" 

所以,在你的javascript视图中做这样的事情来获得你想要的实际字符串表示:

 <%= email.inspect %> 

我编写了一个将Ruby正则表达式转换为JavaScript的小gem:

https://github.com/janosch-x/js_regex

它可以处理比gsub方法更多的情况,并且如果仍存在任何不兼容性,则包括警告。

请注意,无论您做什么,并非所有Ruby正则表达式都可以完全转换为JS,因为Ruby的正则表达式引擎具有许多JavaScript所没有的function 。