Reguläre Ausdrücke in Julia
Ein regulärer Ausdruck beschreibt ein Muster zum Abgleichen von Zeichenketten. Er kann verwendet werden, um zu prüfen, ob eine Zeichenkette eine bestimmte Teilzeichenkette enthält, übereinstimmende Teilzeichenketten zu ersetzen oder Teilzeichenketten, die eine bestimmte Bedingung erfüllen, aus einer Zeichenkette zu extrahieren.
Julia verfügt über reguläre Ausdrücke (Regexes), die mit Perl kompatibel sind.
Die drei Formen regulärer Ausdrücke in Julia sind Abgleich, Ersetzung und Transformation:
Abgleich: m/
/ (kann auch als / abgekürzt werden /, wobei m weggelassen wird) Substitution: s/
/ / Transformation: tr/
/ /
Diese drei Formen werden im Allgemeinen mit=~oder!~zusammen verwendet; =~ zeigt eine Übereinstimmung an, und !~ zeigt keine Übereinstimmung an.
In Julia verwendet die Eingabe regulärer Ausdrücke Präfixe, die allermit Folgendem beginnen:
Beispiel
r"^\s*(?:#|$)"
julia> typeof(re)
Regex
Um zu prüfen, ob ein regulärer Ausdruck mit einer Zeichenkette übereinstimmt, verwenden Sieoccursin:
Beispiel
false
julia> occursin(r"^\s*(?:#|$)", "# a comment")
wahr
Wie Sie sehen können,occursingibt nur true oder false zurück, was angibt, ob der angegebene Regex in der Zeichenkette vorkommt. Normalerweise möchten wir jedoch nicht nur wissen, ob die Zeichenkette übereinstimmt, sondern auch wie sie übereinstimmt. Um die Übereinstimmungsinformationen zu erfassen, können Sie diematchFunktion:
Beispiel
julia> match(r"^\s*(?:#|$)", "# a comment")
RegexMatch("#")
Wenn der reguläre Ausdruck nicht auf die angegebene Zeichenkette passt, gibt match nothing zurück — einen speziellen Wert, der in der interaktiven Eingabeaufforderung nichts ausgibt. Abgesehen davon, dass er nichts ausgibt, ist er ein völlig normaler Wert, der programmatisch getestet werden kann:
Beispiel
if m === nothing
println("not a comment")
else
println("blank or comment")
end
Wenn der reguläre Ausdruck übereinstimmt, gibt match ein RegexMatch-Objekt zurück. Diese Objekte halten fest, wie der Ausdruck übereingestimmt hat, einschließlich der Teilzeichenkette, auf die das Muster passt, und aller Teilzeichenketten, die möglicherweise erfasst wurden. Das obige Beispiel hat nur einen Teil der übereinstimmenden Teilzeichenkette erfasst, aber vielleicht möchten wir jeden nicht leeren Text nach dem Kommentarzeichen erfassen. Das können wir so machen:
Beispiel
RegexMatch("# a comment ", 1="a comment")
Beim Aufruf von match können Sie optional den Index angeben, an dem die Suche beginnen soll. Zum Beispiel:
Beispiel
RegexMatch("1")
julia> m = match(r"[0-9]","aaaa1aaaa2aaaa3",6)
RegexMatch("2")
julia> m = match(r"[0-9]","aaaa1aaaa2aaaa3",11)
RegexMatch("3")
Sie können die folgenden Informationen aus einem RegexMatch-Objekt extrahieren:
- Der gesamte übereinstimmende Teilstring:m.match
- Die erfassten Teilstrings als Array von Strings:m.captures
- Der Offset, an dem die gesamte Übereinstimmung beginnt:m.offset
- Die Offsets der erfassten Teilstrings als Vektor:m.offsets
Wenn eine Erfassung nicht übereinstimmt,m.capturesenthält sie an dieser Position keinen Teilstring mehr, sondern nichts; außerdem istm.offsetsder Offset 0 (denken Sie daran, dass Julias Indexierung bei 1 beginnt, ein Offset von 0 also für einen String ungültig ist). Hier sind zwei etwas konstruierte Beispiele:
Beispiel
RegexMatch("acd", 1="a", 2="c", 3="d")
julia> m.match
"acd"
julia> m.captures
3-Element Vector{Union{Nothing, SubString{String}}}:
"a"
"c"
"d"
julia> m.offset
1
julia> m.offsets
3-Element Vector{Int64}:
1
2
3
julia> m = match(r"(a|b)(c)?(d)", "ad")
RegexMatch("ad", 1="a", 2=nothing, 3="d")
julia> m.match
"ad"
julia> m.captures
3-Element Vector{Union{Nothing, SubString{String}}}:
"a"
nothing
"d"
julia> m.offset
1
julia> m.offsets
3-Element Vector{Int64}:
1
0
2
Es ist praktisch, dass Captures als Array zurückgegeben werden, denn man kann sie mithilfe der Destrukturierungssyntax an lokale Variablen binden. Der Einfachheit halber implementieren RegexMatch-Objekte eine Iterator-Methode, die an das Feld captures delegiert, sodass man das Match-Objekt direkt destrukturieren kann:
Beispiel
"a"
Auf Captures kann auch zugegriffen werden, indem man das RegexMatch-Objekt mit der Nummer oder dem Namen der Capture-Gruppe indiziert:
Beispiel
RegexMatch("12:45", hour="12", minute="45")
julia> m[:minute]
"45"
julia> m[2]
"45"
Wenn Sie replace verwenden, können Sie in der Ersetzungszeichenfolge Captures referenzieren, indem Sie \n verwenden, um auf die n-te Capture-Gruppe zu verweisen, und der Ersetzungszeichenfolge ein s voranstellen. Capture-Gruppe 0 bezieht sich auf die gesamte Übereinstimmung. In Ersetzungen kann \g
julia> replace("first second", r"(\w+) (?<agroup>\w+)" => s"\g<agroup> \1")
"second first"Der Klarheit halber können nummerierte Capture-Gruppen auch mit \g referenziert werden
julia> replace("a", r"." => s"\g<0>1")
"a1"Sie können einen Regex ändern, indem Sie Flags wie i, m, s und x nach dem schließenden doppelten Anführungszeichen hinzufügen.
Weitere Informationen zu regulären Ausdrücken finden Sie unter:Reguläre Ausdrücke - Tutorial
Andere Erweiterungen