Extrahieren Sie den Wert aus der Zeichenfolge mit verschachtelten Klammern

WBOY
Freigeben: 2024-02-08 23:54:10
nach vorne
744 Leute haben es durchsucht

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"]
Nach dem Login kopieren

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>
Nach dem Login kopieren



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
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage