Maison  >  Article  >  développement back-end  >  Extraire la valeur d'une chaîne avec des crochets imbriqués

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

WBOY
WBOYavant
2024-02-08 23:54:10737parcourir

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"]

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>



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
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer