Как перевести регулярное выражение ruby ​​в javascript? - (? i-mx: ..) и Rails 3.0.3 - PullRequest
11 голосов
/ 31 января 2011

Я использую метод 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

?

Ответы [ 3 ]

7 голосов
/ 08 марта 2013

Регулярные выражения Ruby и JavaScript анализируются и выполняются разными движками с разными возможностями.Из-за этого регулярные выражения Ruby и JavaScript имеют небольшие, тонкие различия, которые немного несовместимы.Если вы помните, что они не переводят напрямую, вы все равно можете представлять простые регулярные выражения Ruby в JavaScript.

Вот , что делает проверка на стороне клиента :

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

Недавнее добавление инспектора маршрутов к рельсам использует аналогичный подход , возможно, даже лучше, поскольку он позволяет избежать исправлений обезьян:

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 голос
/ 14 октября 2015

Я написал небольшой гем, который переводит регулярные выражения Ruby в JavaScript:

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

Он может обрабатывать больше случаев, чем подход gsub, и включает предупреждения, если сохраняются какие-либо несовместимости.

Обратите внимание, что независимо от того, что вы делаете, не все регулярные выражения Ruby могут быть полностью переведены на JS, потому что механизм регулярных выражений Ruby имеет множество функций, которых нет в JavaScript .

1 голос
/ 31 января 2011

Причина в том, что вы преобразовываете свое регулярное выражение, используя .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 %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...