Heim  >  Artikel  >  Backend-Entwicklung  >  Extrahieren Sie den Wert aus der Zeichenfolge mit verschachtelten Klammern

Extrahieren Sie den Wert aus der Zeichenfolge mit verschachtelten Klammern

WBOY
WBOYnach vorne
2024-02-08 23:54:10688Durchsuche

Extrahieren Sie den Wert aus der Zeichenfolge mit verschachtelten Klammern

Der PHP-Editor Banana stellt Ihnen eine Methode vor, mit der Sie in PHP den Wert aus einer Zeichenfolge mit verschachtelten Klammern extrahieren können. Während der Entwicklung stoßen wir manchmal auf Situationen, in denen wir bestimmte Werte aus einer komplexen Zeichenfolge extrahieren müssen und diese Werte möglicherweise in mehreren Klammern verschachtelt sind. In diesem Artikel erfahren Sie, wie Sie die String-Verarbeitungsfunktionen, Rekursion und regulären Ausdrücke von PHP verwenden, um dieses Problem zu lösen. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, erhalten Sie in diesem Artikel praktische Tipps und Beispielcode, mit denen Sie diese Art von Aufgabe problemlos bewältigen können.

Frageninhalt


Gegeben eine Eingabezeichenfolge, zum Beispiel:

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

String-Array zurückgeben:

["ABCDA", "ABCBF", "ABCGAL", "ABDBNX", "ABDBAQQ", "ABDBAAN", "ABDBB", "ABFHGG"]

Ich konnte eine Teillösung schreiben, aber wenn es mehrere gibt [children] ist es schwierig, den Überblick über den übergeordneten Knoten zu behalten.

Noch eine Testzeichenfolge: 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>



Problemumgehung


Oftmals können diese Probleme, die scheinbar das Ausbalancieren von Klammern oder das Verfolgen früherer Zeichenmuster erfordern, gut mit Rekursion gelöst werden. Das ist eine effektive Lösung

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
}

Demo

Das obige ist der detaillierte Inhalt vonExtrahieren Sie den Wert aus der Zeichenfolge mit verschachtelten Klammern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen