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

jac*_*012 11 javascript regex ruby-on-rails

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

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

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

(?i-mx:^([^@\\s]+)@((?:[-a-z0-9]+\\.)+[a-z]{2,})$)
Run Code Online (Sandbox Code Playgroud)

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

/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
Run Code Online (Sandbox Code Playgroud)

sj2*_*j26 7

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

以下是客户端验证的作用:

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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


Pan*_*kos 6

原因是您正在使用 .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"
Run Code Online (Sandbox Code Playgroud)

因此,在您的 javascript 视图中执行类似以下操作来获取您想要的实际字符串表示形式:

<%= email.inspect %>
Run Code Online (Sandbox Code Playgroud)