Возьмите этот фрагмент кода, который должен заменить тег href на его URL:
irb> s='<p><a href="http://localhost/activate/57f7e805827f" style="color:#F19300;font-weight:bold">Click here!</a></p>'
irb> s.gsub(/<a href="([^ '"]*)"([^>]*)?>([^<]*)<\/a>/, "#{$1}")
=> "<p></p>"
Это регулярное выражение не работает (URL не найден). Затем я избегаю символа <
в регулярном выражении, и это работает:
irb> s.gsub(/<a href="([^ '"]*)"([^>]*)?>([^\<]*)<\/a>/, "#{$1}")
=> "<p>http://localhost/activate/57f7e805827f</p>"
1: Согласно проверкам RubyMine, в этом побеге нет необходимости. Это верно? Если да, то почему побег >
тоже не нужен?
2: Затем в том же сеансе IRB с той же строкой исходное регулярное выражение неожиданно работает:
irb> s.gsub(/<a href="([^ '"]*)"([^>]*)?>([^<]*)<\/a>/, "#{$1}")
=> "<p>http://localhost/activate/57f7e805827f</p>"
Это потому, что переменная $1
не очищается при повторном вызове gsub
? Если да, то это преднамеренное поведение или это ошибка регулярного выражения Ruby?
3: когда я изменяю строку и повторно выполняю ту же команду, $1
изменится только после двойного вызова gsub
для измененной строки:
irb> s='<p><a href="http://localhost/activate/xxxxyyy" style="color:#F19300;font-weight:bold">Click here!</a></p>'
=> "<p><a href=\"http://localhost/activate/xxxxyyy\" style=\"color:#F19300;font-weight:bold\">Click here!</a></p>"
irb> s.gsub(/<a href="([^ '"]*)"([^>]*)?>([^\<]*)<\/a>/, "#{$1}")
=> "<p>http://localhost/activate/57f7e805827f</p>"
irb> s.gsub(/<a href="([^ '"]*)"([^>]*)?>([^\<]*)<\/a>/, "#{$1}")
=> "<p>http://localhost/activate/xxxxyyy</p>"
Это намеренно? Если да, то какая логика стоит за этим?
4: В качестве замены символа в некоторых учебниках предлагается использовать "#{$n}"
, в других — '\n'
. С вариантом с обратной косой чертой описанные выше проблемы не возникают. Почему - в чем разница между ними?
Благодарю вас!