我使用validates_format_of方法检查电子邮件格式:
validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
我也使用livevalidation插件验证表单,所以在我的代码中我得到:
(?i-mx:^([^@\\s]+)@((?:[-a-z0-9]+\\.)+[a-z]{2,})$)
Javascript无法读取此正则表达式。我如何或在哪里可以将此正则表达式更改为原始:
/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
答案 0 :(得分:7)
Ruby和JavaScript正则表达式由具有不同功能的不同引擎解析和执行。因此,Ruby和JavaScript正则表达式之间存在细微的差异,这些差异略微不相容。如果您注意不直接翻译,您仍然可以用JavaScript表示简单的Ruby正则表达式。
这是what client side validations does:
class Regexp
def to_javascript
Regexp.new(inspect.sub('\\A','^').sub('\\Z','$').sub('\\z','$').sub(/^\//,'').sub(/\/[a-z]*$/,'').gsub(/\(\?#.+\)/, '').gsub(/\(\?-\w+:/,'('), self.options).inspect
end
end
最近的addition of the routes inspector to rails需要a similar approach,可能更好,因为它避免了猴子修补:
def json_regexp(regexp)
str = regexp.inspect.
sub('\\A' , '^').
sub('\\Z' , '$').
sub('\\z' , '$').
sub(/^\// , '').
sub(/\/[a-z]*$/ , '').
gsub(/\(\?#.+\)/ , '').
gsub(/\(\?-\w+:/ , '(').
gsub(/\s/ , '')
Regexp.new(str).source
end
然后将这些插入到您的javascript代码中,请使用以下内容:
var regexp = #{/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i.to_javascript};
答案 1 :(得分:1)
原因是您使用.to_s而不是.inspect转换正则表达式。您需要在视图中使用.inspect来获取正确的格式。以下是一些示例代码,可以解释这个问题:
email = /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
email.to_s #"(?i-mx:^([^@\\s]+)@((?:[-a-z0-9]+\\.)+[a-z]{2,})$)"
email.inspect #"/^([^@\\s]+)@((?:[-a-z0-9]+\\.)+[a-z]{2,})$/i"
所以,在你的javascript视图中做这样的事情来获得你想要的实际字符串表示:
<%= email.inspect %>
答案 2 :(得分:1)
我编写了一个将Ruby正则表达到JavaScript的小宝石:
https://github.com/janosch-x/js_regex
它可以处理比gsub方法更多的情况,并且如果仍存在任何不兼容性,则包括警告。
请注意,无论您做什么,并非所有Ruby正则表达式都可以完全转换为JS,因为Ruby的正则表达式引擎has a lot of features that JavaScript's doesn't have。