условное разбиение строки - PullRequest
0 голосов
/ 14 мая 2018

Я хочу разбить строку типа «a / b / c» и разрешить экранирование с помощью «\».Например:

'foo/bar\/2.2/baz':
a=foo
b=bar/2.2
c=baz

Есть ли какой-нибудь элегантный способ разбить на '/', игнорируя '\ /'?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Вы можете использовать что-то в стиле:

func split(str string) []string {
    var parts []string
    var current bytes.Buffer
    escaped := false

    for _, r := range str {
        if r == '\\' && !escaped {
            escaped = true
        } else if r == '/' && !escaped {
            parts = append(parts, current.String())
            current.Reset()
        } else {
            escaped = false
            current.WriteRune(r)
        }
    }
    parts = append(parts, current.String())
    return parts
}

Ссылка Go Playground: https://play.golang.org/p/RwLwFlsAW2Q

0 голосов
/ 14 мая 2018

У вас есть два основных подхода, независимо от используемого вами языка.

  1. Поиск всех вхождений /, которым непосредственно не предшествует \, и выполнение разделения.
  2. Замените все экземпляры \/ каким-либо уникальным символом, который не содержит /, затем разделите на / и замените уникальный символ на \/ снова.

С вычислительной точки зрения первый будет более эффективным.

С точки зрения сложности кодирования последнее, вероятно, будет легче писать.

...