openlang

Ruby regex не работает при создании из сохранённой строки

Я храню регулярное выражение в следующей переменной - pattern_text = "/\A([^@\s]+)@((?:c-d+\.)+(in|com))\z/".

"mailbox@c-d.in".match?(/\A([^@\s]+)@((?:c-d+\.)+(in|com))\z/) => returns true
Regexp.new(pattern_text) => returns /\/A([^@ ]+)@((?:c-d+.)+(in|com))z\//
"mailbox@c-d.in".match?(Regexp.new(pattern_text)) => returns false

При сохранении этого регулярного выражения в мою базу данных \ автоматически исчезает. Валидатор регулярного выражения приходит ко мне в виде строки. Почему такой вариант не работает?

Переведено с английскогоПоказать оригинал

Разговор продолжается 2

Следуя доводам
  1. Ссылка на ответ

    Выберите строки в одинарных кавычках вместо двойных (см. это описание (https://en.wikibooks.org/wiki/Ruby_Programming/Strings#Single_quotes))

    > puts "/\A([^@\s]+)@((?:c-d+\.)+(in|com))\z/"
    /A([^@ ]+)@((?:c-d+.)+(in|com))z/
    
    > puts '/\A([^@\s]+)@((?:c-d+\.)+(in|com))\z/'
    /\A([^@\s]+)@((?:c-d+\.)+(in|com))\z/

    Затем уберите '/' с обоих концов:

    > pattern_text = '\A([^@\s]+)@((?:c-d+\.)+(in|com))\z'
    => "\\A([^@\\s]+)@((?:c-d+\\.)+(in|com))\\z"
    
    > compiled = Regexp.new(pattern_text)
    => /\A([^@\s]+)@((?:c-d+\.)+(in|com))\z/
    
    > "mailbox@c-d.in".match?(Regexp.new(compiled))
    => true
    Переведено с английскогоПоказать оригинал
  2. Ссылка на ответ

    При сохранении шаблона регулярного выражения в базе данных для последующего использования обычно сохраняют строковое представление шаблона / флагов.

    Поэтому, если вся информация о регулярном выражении должна находиться в одном столбце, можно использовать Regexp#to_s (https://ruby-doc.org/core-2.5.1/Regexp.html#method-i-to_s):

    stored_expression = /.../.to_s

    Чтобы хранить шаблон (source (https://ruby-doc.org/core-2.5.1/Regexp.html#method-i-source)) отдельно от флагов (options (https://ruby-doc.org/core-2.5.1/Regexp.html#method-i-options)) в виде строк:

    stored_pattern = /\A([^@\s]+)@((?:c-d+\.)+(in|com))\z/.source
    stored_flags   = /\A([^@\s]+)@((?:c-d+\.)+(in|com))\z/.options

    Прочитав эти значения из базы данных, восстановите объект регулярного выражения конструктором Regexp.new (https://ruby-doc.org/core-2.5.1/Regexp.html#method-c-new):

    expression = Regexp.new(stored_expression)
    # alternatively
    expression = Regexp.new(stored_pattern, stored_flags)

    Обратитесь к документации Ruby по Regexp (https://ruby-doc.org/core-2.5.1/Regexp.html).

    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. Как экранировать проценты при вызове String.Format?

    В файле strings.xml у меня хранится SQL-запрос, и я пытаюсь построить итоговую строку в коде через String.Format. Запрос SELE…

    Ответы 3Последняя активность java
  2. Форматирование строк в F#

    Впервые делаю библиотеку на F# При использовании string.Format получаю сообщение, что такой функции не существует. Я что-то д…

    Ответы 2Последняя активность fsharp
  3. Извлечение одной части строки в tcl

    В tcl я пытаюсь разделить Reports/Report#2.rpt и оставить только Report#2.rpt ; попробовал такой способ, но при выполнении он…

    Ответы 2Последняя активность tcl