Самым интересным является линия fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1W"))
. docs say:
Внутри REPL, $
знаки интерпретируются как в Expand
И Expand говорит:
В шаблоне, переменная обозначается подстроки вида $name
или ${name}
, где имя - непустая последовательность букв, цифр и символов подчеркивания. Ссылка на вне диапазона или непревзойденный индекс или имя, которое отсутствует в регулярном выражении, заменяется пустым фрагментом.
В $name
форме, название взято, чтобы быть как можно дольше: $1x
эквивалентно ${1x}
, не ${1}x
, и, $10
эквивалентно ${10}
, а не ${1}0
.
Так, в 3-й замене, $1W
рассматриваются как ${1W}
и так как эта группа не инициализирована, пустая строка используется для замены.
Когда я говорю «группа не инициализирована», я хочу сказать, что группа не определена в шаблоне регулярных выражений, поэтому она не была заполнена во время операции . Замена означает получение всех совпадений, а затем их заменяет шаблон замены. Обратные ссылки ($xx
) заселены во время , соответствующие фазе. Группа $1W
отсутствует в шаблоне, таким образом, она не была заполнена во время , соответствующей, и только когда пустая строка используется, когда заменяется на.
2-я и 4-я замены легко понятны и описаны в приведенных выше ответах. Всего $1
обратные_связи персонажи захватил с первой группой захвата (подшаблон заключенного с парой неэкранированных скобок), то же самым с примером 4.
Вы можете думать о {}
как средство неоднозначности замены шаблон.
Теперь, если вам нужно сделать результаты последовательны, используйте с именем захвата(?P<1W>....)
:
re := regexp.MustCompile("a(?P<1W>x*)b") // <= See here, pattern updated
fmt.Println(re.ReplaceAllString("-ab-axxb-", "T"))
fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1"))
fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1W"))
fmt.Println(re.ReplaceAllString("-ab-axxb-", "${1}W"))
Результаты:
-T-T-
--xx-
--xx-
-W-xxW-
2-й и 3-й линии в настоящее время производят последовательный выход, так как названная группа 1W
также является первой группой и $1
пронумерованными точками обратной ссылки к тому же тексту, записанному с именованным захватом $1W
.
Вы прочитали текст сразу над примером кода? – ruakh
Да, я читал. Но я все еще не понимаю, как работает расширение. –