Maison > développement back-end > Golang > le corps du texte

Extraire la valeur d'une chaîne avec des crochets imbriqués

WBOY
Libérer: 2024-02-08 23:54:10
avant
743 Les gens l'ont consulté

Extraire la valeur dune chaîne avec des crochets imbriqués

l'éditeur php Banana vous présentera une méthode pour extraire la valeur d'une chaîne avec des crochets imbriqués en PHP. Au cours du développement, nous rencontrons parfois des situations dans lesquelles nous devons extraire des valeurs spécifiques d'une chaîne complexe, et ces valeurs peuvent être imbriquées dans plusieurs parenthèses. Cet article vous montrera comment utiliser les fonctions de traitement de chaînes, la récursivité et les expressions régulières de PHP pour résoudre ce problème. Que vous soyez débutant ou développeur expérimenté, cet article vous fournira des conseils pratiques et des exemples de code pour vous aider à aborder ce type de tâche en toute simplicité.

Contenu de la question


Étant donné une chaîne d'entrée, par exemple :

AB[C[DA,BF,GAL],DB[NX,AQQ,AAN,B],F[H[GG,BAND]]]

Tableau de chaînes de retour :

["ABCDA", "ABCBF", "ABCGAL", "ABDBNX", "ABDBAQQ", "ABDBAAN", "ABDBB", "ABFHGG"]
Copier après la connexion

J'ai pu écrire une solution partielle, mais s'il y en a plusieurs [children], il est difficile de garder une trace du nœud parent.

Une autre chaîne de test : ZHLADAOR[R[G[45D[COI,EMA],Q5D[COI,EMA],U5D[COI,EMA],Y5D[COI,EMA]],HE5D[COI,EMA]], SG[A5D[COI,EMA],E5D[COI,EMA],I5D[COI,EMA]]]

<code>func expandNestedString(str string) []string {
    var parts []string
    var currentPart []rune
    var openBrackets int
    var level int
    var bitsBeforeComma int
    var prevBitsBeforeComma int

    for _, char := range str {
        if char == '[' {
            openBrackets++
            level++
            prevBitsBeforeComma = bitsBeforeComma
            bitsBeforeComma = 0
        } else if char == ']' {
            openBrackets--

            if openBrackets == 0 {
                if level == 0 && len(currentPart) > 0 {
                    parts = append(parts, string(currentPart))
                }
                currentPart = []rune{}
                level--
            } else {
                parts = append(parts, string(currentPart))
                currentPart = currentPart[:len(currentPart)-(bitsBeforeComma+prevBitsBeforeComma)]
                bitsBeforeComma = 0
            }
        } else if char == ',' {
            parts = append(parts, string(currentPart))
            currentPart = currentPart[:len(currentPart)-bitsBeforeComma]
            bitsBeforeComma = 0
        } else {
            currentPart = append(currentPart, char)
            bitsBeforeComma++
        }
    }

    if len(currentPart) > 0 {
        parts = append(parts, string(currentPart))
    }

    return parts
}
</code>
Copier après la connexion



Solution de contournement


Souvent, ces problèmes qui semblent nécessiter un équilibrage des parenthèses ou le suivi des modèles de caractères précédents peuvent être bien résolus avec la récursivité. C'est une solution efficace

func expand(s []rune, idx int) ([][]rune, int) {
    var prefix []rune
    var result [][]rune
    for ; idx < len(s); idx++ {
        switch s[idx] {
        case '[':
            runes, lastIdx := expand(s, idx+1)
            for _, r := range runes {
                result = append(result, append(prefix, r...))
            }
            idx = lastIdx
            prefix = []rune{}
        case ']':
            if len(prefix) > 0 {
                result = append(result, prefix)
            }
            return result, idx
        case ',':
            if len(prefix) > 0 {
                result = append(result, prefix)
                prefix = []rune{}
            }
        default:
            prefix = append(prefix, s[idx])
        }
    }
    if len(prefix) > 0 {
        result = append(result, prefix)
    }
    return result, idx
}

func expandNestedString(s string) []string {
    runes, _ := expand([]rune(s), 0)
    var result []string
    for _, r := range runes {
        result = append(result, string(r))
    }
    return result
}
Copier après la connexion

Démo

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal