commit
2bc41aa412
20
unpack.go
20
unpack.go
|
@ -27,6 +27,12 @@ func Unpack(str string) (string, error) {
|
||||||
|
|
||||||
var runeArray = []rune(str)
|
var runeArray = []rune(str)
|
||||||
|
|
||||||
|
//re, _ := regexp.Compile(`^\d|\d{2,}`)
|
||||||
|
//
|
||||||
|
//if re.MatchString(str) == true {
|
||||||
|
// return "", ErrInvalidString
|
||||||
|
//}
|
||||||
|
|
||||||
if len(runeArray) > 0 && unicode.IsDigit(runeArray[0]) {
|
if len(runeArray) > 0 && unicode.IsDigit(runeArray[0]) {
|
||||||
// Если первый символ является цифрой, возвращаем ошибку "недопустимой строки".
|
// Если первый символ является цифрой, возвращаем ошибку "недопустимой строки".
|
||||||
return "first rune is digit", ErrInvalidString
|
return "first rune is digit", ErrInvalidString
|
||||||
|
@ -55,11 +61,21 @@ func Unpack(str string) (string, error) {
|
||||||
}
|
}
|
||||||
case number:
|
case number:
|
||||||
if unicode.IsDigit(char) {
|
if unicode.IsDigit(char) {
|
||||||
// Если после цифры идет ещё одна цифра, возвращаем ошибку "недопустимой строки".
|
var n = strconv.Itoa(numOfRepeat)
|
||||||
return "", ErrInvalidString
|
numOfRepeat, _ = strconv.Atoi(n + string(char))
|
||||||
|
repStr, err := repeatRune(runeArray[i-2], numOfRepeat)
|
||||||
|
if err != nil {
|
||||||
|
// Если функция repeatRune возвращает ошибку, удаляем последний символ из результата.
|
||||||
|
res := result.String()
|
||||||
|
result.Reset()
|
||||||
|
result.WriteString(res[0 : len(res)-1])
|
||||||
}
|
}
|
||||||
|
result.WriteString(repStr)
|
||||||
|
} else {
|
||||||
result.WriteRune(char)
|
result.WriteRune(char)
|
||||||
currentState = start
|
currentState = start
|
||||||
|
}
|
||||||
|
|
||||||
case escape:
|
case escape:
|
||||||
// Если предыдущий символ - обратный слэш, добавляем текущий в результат.
|
// Если предыдущий символ - обратный слэш, добавляем текущий в результат.
|
||||||
result.WriteRune(char)
|
result.WriteRune(char)
|
||||||
|
|
|
@ -39,7 +39,7 @@ func TestUnpack(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestUnpackInvalidString(t *testing.T) {
|
func TestUnpackInvalidString(t *testing.T) {
|
||||||
invalidStrings := []string{"3abc", "45", "aaa10b", "1"}
|
invalidStrings := []string{"3abc", "45", "1"}
|
||||||
for _, tc := range invalidStrings {
|
for _, tc := range invalidStrings {
|
||||||
tc := tc
|
tc := tc
|
||||||
t.Run(tc, func(t *testing.T) {
|
t.Run(tc, func(t *testing.T) {
|
||||||
|
@ -48,3 +48,20 @@ func TestUnpackInvalidString(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestStringContainsNumber(t *testing.T) {
|
||||||
|
testStrings := []struct {
|
||||||
|
input string
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{input: "aaa10b", expected: "aaaaaaaaaaaab"},
|
||||||
|
{input: "a12b4", expected: "aaaaaaaaaaaabbbb"},
|
||||||
|
}
|
||||||
|
for _, tc := range testStrings {
|
||||||
|
t.Run(tc.input, func(t *testing.T) {
|
||||||
|
result, err := Unpack(tc.input)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, tc.expected, result)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue