如何将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 。