Как найти точный символ в определенной позиции в строке - PullRequest
0 голосов
/ 26 июня 2019

У меня есть следующая строка:

absoloute-power

Как видите, в позиции 10 в строке есть знак "-".Как мне написать код go для проверки, если в 10-й позиции любой заданной строки есть «-» в строке?

Ответы [ 3 ]

1 голос
/ 27 июня 2019

В Go строковые символьные значения представляют собой символы Unicode, закодированные в UTF-8.UTF-8 - это кодировка переменной длины, которая использует от одного до четырех байтов на символ.

Например:

package main

import (
    "fmt"
    "unicode/utf8"
)

func is10Hyphen(s string) bool {
    for n := 1; len(s) > 0; n++ {
        r, size := utf8.DecodeRuneInString(s)
        if r == utf8.RuneError && (size == 0 || size == 1) {
            return false
        }
        if n == 10 {
            return r == '-'
        }
        s = s[size:]
    }
    return false
}

func main() {
    s := "absoloute-power"
    fmt.Println(is10Hyphen(s))
    s = "absoloute+power"
    fmt.Println(is10Hyphen(s))
    s = "absoloute"
    fmt.Println(is10Hyphen(s))
}

Playground: https://play.golang.org/p/h9rMQWWAdvb

Вывод:

true
false
false

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

func is10Hyphen(s string) bool {
    n := 0
    for _, r := range s {
        if r == utf8.RuneError {
            return false
        }
        n++
        if n == 10 {
            return r == '-'
        }
    }
    return false
}

Детская площадка: https://play.golang.org/p/SHbPAnldTyw

0 голосов
/ 27 июня 2019

Поскольку строка на самом деле является массивом, вы можете получить доступ к 10-й позиции напрямую. Конечно, нужно избегать ошибки «вне диапазона».Для случая кодирования не-ascii, преобразование его в массив рун

package main

import (
  "fmt"
)

func main() {
  fmt.Println(Check("213123-dasdas"))
  fmt.Println(Check("213123sdas"))
  fmt.Println(Check("213123das-das"))
  fmt.Println(Check("213123dasda-s"))
  fmt.Println(Check("---------2----------"))
}

func Check(ss string) bool {
  r = []rune(ss)
  if len(r) < 10 {
    return false
  }
  return ss[r] == '-'
}
0 голосов
/ 26 июня 2019

Вы можете использовать массив рун:

text := "ifthisisyourstring"
chars := []rune(text)
if chars[0] == '1' {
    // is true
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...