2016-10-16 4 views
1

Im пытается заменить строку со случайными числами с диапазоном чисел, определенной в строкеПолучение значений группы в ReplaceAllStringFunc обратного вызова

package main 

import (
    "fmt" 
    "math/rand" 
    "regexp" 
    "strconv" 
) 

func replaceFunc(s string) string { 
    groups := //?? How do i get the current mach groups 
    return rand.Intn(groups[2] - groups[1]) + groups[1] 
} 

func main() { 
    rand.Seed(time.Now().Unix()) 
    repl := "1,10 1,50 1,12 1,2 1,3" 
    repl = regexp.MustCompile("(\\d+),(\\d+)").ReplaceAllStringFunc(repl, replaceFunc) 
    fmt.Println(repl) 
} 

Как бы получить регулярное выражение группы при замене?

+0

Ваш вопрос не ясно для меня. Что вы хотите получить в результате? –

+0

Я хочу, чтобы каждое (\ d +), (\ d +) регулярное выражение заменялось уникальным случайным числом, которое находится между первой цифрой и второй цифрой. Таким образом, «1,2 3,4 5,6» заменяется на (например) «2 4 5», поскольку первое число находится между 1-2, затем следующее 3-4, затем следующее между 5 -6. – BahNahNah

ответ

2

Вы получите каждое соответствие индивидуально в качестве аргумента функции (replaceFunc будет вызываться один раз за матч, но не один раз для каждой группы).

Вы можете использовать strings.Split дробить числа, а затем преобразовать их в Интс:

https://play.golang.org/p/ks0tkMQ2TY

func replaceFunc(s string) string { 
    pieces:= strings.Split(s, ",") 
    a,_ := strconv.Atoi(pieces[0]) 
    b,_ := strconv.Atoi(pieces[1]) 
    return strconv.Itoa(rand.Intn(b - a) + a) 
} 

func main() { 
    rand.Seed(time.Now().Unix()) 
    repl := "1,10 1,50 1,12 1,2 1,3" 
    repl = regexp.MustCompile("(\\d+),(\\d+)").ReplaceAllStringFunc(repl, replaceFunc) 
    fmt.Println(repl) 
}