Перевести регулярное выражение Ruby в JavaScript

#javascript #ruby-on-rails #ruby #regex

#javascript #ruby-on-rails #ruby #регулярное выражение

Вопрос:

У меня есть такое регулярное выражение в ruby on rails

 /A([^@s] )@((?:[-a-z0-9] .) [a-z]{2,})Z/i
  

Я бы хотел использовать ту же логику проверки электронной почты во внешнем интерфейсе.

Я пытался использовать .inspect метод в irb консоли, похоже, он не возвращает допустимое регулярное выражение js.

Насколько я понимаю A , это a ^ , Z это a $ . [-a-z0-9] вероятно, переводится [a-zA-Z0-9] как . Не уверен насчет остального.

Я тоже пытался найти онлайн-конвертер, но не смог его найти. Ответы в других подобных темах в SO не сработали.

Какой самый простой способ перевести такое регулярное выражение из ruby в javascript?

Комментарии:

1. Вы пытались использовать его как есть в javascript? Каков результат>?

2. Он должен переводиться примерно от 1 до 1, похоже, вы уже указали на некоторые преобразования, за исключением того, что [-a-z0-9] они должны оставаться неизменными. Оно соответствует любой строчной букве, цифре или тире (-). Тире не имеет особого значения в начале символьного класса.

Ответ №1:

Как указано Даниэлем в комментарии, оно должно просто переводиться один к одному, я неправильно предположил, что [-a-z0-9] его следует заменить.

Версия Ruby:

 /A([^@s] )@((?:[-a-z0-9] .) [a-z]{2,})Z/i
  

Версия JavaScript:

 /^([^@s] )@((?:[-a-z0-9] .) [a-z]{2,})$/
  

Некоторые тесты:

 /^([^@s] )@((?:[-a-z0-9] .) [a-z]{2,})$/i.test("test@email.com"); // true
/^([^@s] )@((?:[-a-z0-9] .) [a-z]{2,})$/i.test("test@emailcom");  // false
/^([^@s] )@((?:[-a-z0-9] .) [a-z]{2,})$/i.test("testemail.com");  // false
  

Ответ №2:

Вы пробовали это?

 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
  

Когда вы предоставляете его клиенту, просто создайте экземпляр нового RegExp объекта с результирующей строкой:

 new RegExp(regexpStringFromRuby);
  

Проверьте драгоценный камень client_side_validations. Это может быть то, что вам нужно.

Комментарии:

1. Я не понимаю, должен ли я создать Regexp класс с методом, определенным выше? Еще одна вещь, которую я не понимаю, почему разные имена классов Rexexp против RegExp ?