2014-12-30 3 views
4

Я бы хотел заменить текст внутри скобок, и у него есть colon и u.Заменить текст в скобках gsub

Например, Here is a link [u:person]! стал бы Here is a link <a href="/user/person">Person</a>! Я не очень опытный с регулярным выражением, и у меня возникли проблемы с \1 и $1

Вот регулярное выражение, которое я использую в настоящее время:

string.gsub(/\[(\w*).*?\]/, "<a href='/user/\1'>\1</a>") 

ответ

0

Вы могли бы использовать регулярное выражение, как это:

/\[u\:([\S]+)\]/ 

и заменить его:

<a href='/user/#{$1}'>#{$1}</a> 

Вот расстройство того, что это регулярное выражение делает:

  • Во-первых, у нас есть \[, который является только буквальный [ персонажу
  • Далее, мы имеем u и \:, которые являются буквальным u и : знак, соответственно
  • Далее, у нас есть ([\S]). Скобки представляют собой группу захвата, то есть #{$1} будет заполнена в замещающей части регулярного выражения. [\S]+ ищет все символы без пробелов.
  • Наконец, у нас есть \], что является буквальным символом ].

Ваш код должен выглядеть следующим образом:

string.gsub('/\[u\:([\S]+)\]/', '<a href='/user/#{$1}'>#{$1}</a>') 

Вот живой тест регулярное выражение: https://regex101.com/r/vK0iO2

+0

Вы, ребята, попробовали свой код перед публикацией? –

1

I изменил ваше регулярное выражение на это, чтобы зафиксировано person:

/\[\w*:(.*?)\]/ 

А затем заменить его с этой строки:

"<a href=\"/user/#{$1}\">#{$1.capitalize}</a>" 

Вы были близки с $1, он просто должен быть оценен как Ruby (с использованием интерполяции строк, внутри блока):

string.gsub(/\[\w*:(.*?)\]/) { "<a href=\"/user/#{$1}\">#{$1.capitalize}</a>" } 
+1

Это не удается, так как '$ 1' означает предыдущее совпадение регулярных выражений. – AJcodez

1

сделать регулярное выражение /\[\w*:(.*?)\]/ так что person может быть захвачен вместо u. Затем используйте одну строку с кавычками, так что \1 не интерпретируется как \x01.

str = "Here is a link [u:person]!" 
puts str.gsub(/\[\w*:(.*?)\]/, '<a href="/user/\1">\1</a>') 
# => Here is a link <a href="/user/person">person</a>!