Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 沿正则表达式拆分字符串,但保留匹配项_String_Go_Split - Fatal编程技术网

String 沿正则表达式拆分字符串,但保留匹配项

String 沿正则表达式拆分字符串,但保留匹配项,string,go,split,String,Go,Split,我想在常规表达式上拆分字符串,但保留匹配项 我曾尝试在正则表达式上拆分字符串,但它会丢弃匹配项。我也尝试过使用,但我不太擅长将代码从一种语言翻译成另一种语言,更不用说C re:=regexp.MustCompile(`\d`) 数组:=重新拆分(“ab1cd2ef3”,-1) 我需要数组的值为[“ab”、“1”、“cd”、“2”、“ef”、“3”],但数组的值为[“ab”、“cd”、“ef”]。没有错误。我认为这在当前的regexp包中是不可能的,但是拆分可以很容易地扩展到这种行为 这应该适用

我想在常规表达式上拆分字符串,但保留匹配项

我曾尝试在正则表达式上拆分字符串,但它会丢弃匹配项。我也尝试过使用,但我不太擅长将代码从一种语言翻译成另一种语言,更不用说C

re:=regexp.MustCompile(`\d`)
数组:=重新拆分(“ab1cd2ef3”,-1)

我需要数组的值为[“ab”、“1”、“cd”、“2”、“ef”、“3”],但数组的值为[“ab”、“cd”、“ef”]。没有错误。

我认为这在当前的regexp包中是不可能的,但是
拆分可以很容易地扩展到这种行为

这应该适用于您的情况:

func Split(re *regexp.Regexp, s string, n int) []string {
    if n == 0 {
        return nil
    }

    matches := re.FindAllStringIndex(s, n)
    strings := make([]string, 0, len(matches))

    beg := 0
    end := 0
    for _, match := range matches {
        if n > 0 && len(strings) >= n-1 {
            break
        }

        end = match[0]
        if match[1] != 0 {
            strings = append(strings, s[beg:end])
        }
        beg = match[1]
        // This also appends the current match
        strings = append(strings, s[match[0]:match[1]])
    }

    if end != len(s) {
        strings = append(strings, s[beg:])
    }

    return strings
}


愚蠢的解决方案。在字符串中添加分隔符并使用分隔符拆分

package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    re := regexp.MustCompile(`\d+`)
    input := "ab1cd2ef3"
    sep := "|"

    indexes := re.FindAllStringIndex(input, -1)
    fmt.Println(indexes)

    move := 0
    for _, v := range indexes {
        p1 := v[0] + move
        p2 := v[1] + move
        input = input[:p1] + sep + input[p1:p2] + sep + input[p2:]
        move += 2
    }

    result := strings.Split(input, sep)

    fmt.Println(result)
}

您指出的链接中的regex支持类型在Go regex包中不可用。你可以看报纸

您想要实现的(根据给定的示例)可以使用正则表达式匹配数字或非数字

package main

import (
    "fmt"
    "regexp"
)

func main() {
    str := "ab1cd2ef3"
    r := regexp.MustCompile(`(\d|[^\d]+)`)
    fmt.Println(r.FindAllStringSubmatch(str, -1))
}
游乐场:

输出:

[[ab ab] [1 1] [cd cd] [2 2] [ef ef] [3 3]]

我可以对多个分离器执行相同的操作吗?看来我不行<代码>(\(\)\[^\(\)]+)
匹配令牌只需正则表达式。因此,只要您可以使用regex单独表示令牌,就可以有多个令牌由
分隔。如果您可以提供一些示例字符串,它将更容易理解。