How to translate ruby regex to javascript? - (?i-mx:..) and Rails 3.0.3

前端 未结 3 1375
自闭症患者
自闭症患者 2021-01-01 18:34

Im using validates_format_of method to check email format:

validates_format_of :email, :with => /^([^@\\s]+)@((?:[-a-z0-9]+\\.)+[a-z]{2,})$/i
3条回答
  •  渐次进展
    2021-01-01 18:45

    Ruby and JavaScript regular expressions are parsed and executed by different engines with different capabilities. Because of this, Ruby and JavaScript regular expressions have small, subtle differences which are slightly incompatible. If you are mindful that they don't directly translate, you can still represent simple Ruby regular expressions in JavaScript.

    Here's 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
    

    The recent addition of the routes inspector to rails takes a similar approach, perhaps even better as it avoids monkey patching:

    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
    

    Then to insert these into your javascript code, use something like:

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

提交回复
热议问题