Julia Language
regexes
Zoeken…
Syntaxis
- Regex ( "[regex]")
- r "[regex]"
- wedstrijd (naald, hooiberg)
- matchall (naald, hooiberg)
- eachmatch (naald, hooiberg)
- ismatch (naald, hooiberg)
parameters
Parameter | Details |
---|---|
needle | de Regex om in de haystack naar te zoeken |
haystack | de tekst om naar de needle |
Regex literals
Julia ondersteunt reguliere expressies 1 . De PCRE-bibliotheek wordt gebruikt als de regex-implementatie. Regexen zijn als een mini-taal binnen een taal. Aangezien de meeste talen en veel teksteditors enige ondersteuning bieden voor regex, vallen documentatie en voorbeelden van het gebruik van regex in het algemeen buiten het bestek van dit voorbeeld.
Het is mogelijk om een Regex
van een string met behulp van de constructor:
julia> Regex("(cat|dog)s?")
Maar voor het gemak en gemakkelijker ontsnappen, kan de @r_str
string macro in plaats daarvan worden gebruikt:
julia> r"(cat|dog)s?"
1 : Technisch gezien ondersteunt Julia regexen, die verschillen van en krachtiger zijn dan wat reguliere uitdrukkingen in de taaltheorie worden genoemd. Vaak zal de term "reguliere expressie" worden gebruikt om ook naar regexen te verwijzen.
Overeenkomsten zoeken
Er zijn vier primaire handige functies voor reguliere expressies, die allemaal argumenten in needle, haystack
aannemen. De terminologie "naald" en "hooiberg" komt van het Engelse idioom "een naald in een hooiberg vinden". In de context van regexen is de regex de naald en de tekst is de hooiberg.
De match
functie kan worden gebruikt om de eerste match in een string te vinden:
julia> match(r"(cat|dog)s?", "my cats are dogs")
RegexMatch("cats", 1="cat")
De matchall
functie kan worden gebruikt om alle overeenkomsten van een reguliere expressie in een string te vinden:
julia> matchall(r"(cat|dog)s?", "The cat jumped over the dogs.")
2-element Array{SubString{String},1}:
"cat"
"dogs"
De functie ismatch
retourneert een boolean die aangeeft of er een overeenkomst is gevonden in de string:
julia> ismatch(r"(cat|dog)s?", "My pigs")
false
julia> ismatch(r"(cat|dog)s?", "My cats")
true
De eachmatch
functie retourneert een iterator over RegexMatch
objecten, geschikt voor gebruik met for
loops :
julia> for m in eachmatch(r"(cat|dog)s?", "My cats and my dog")
println("Matched $(m.match) at index $(m.offset)")
end
Matched cats at index 4
Matched dog at index 16
Groepen vastleggen
De substrings gevangen genomen door capture groepen zijn toegankelijk vanaf RegexMatch
objecten met behulp van indexering notatie.
De volgende regex ontleedt bijvoorbeeld Noord-Amerikaanse telefoonnummers geschreven in (555)-555-5555
indeling:
julia> phone = r"\((\d{3})\)-(\d{3})-(\d{4})"
en stel dat we de telefoonnummers uit een tekst willen halen:
julia> text = """
My phone number is (555)-505-1000.
Her phone number is (555)-999-9999.
"""
"My phone number is (555)-505-1000.\nHer phone number is (555)-999-9999.\n"
Met behulp van de matchall
functie kunnen we een reeks van de overeenkomende substrings krijgen:
julia> matchall(phone, text)
2-element Array{SubString{String},1}:
"(555)-505-1000"
"(555)-999-9999"
Maar stel dat we toegang willen hebben tot de netnummers (de eerste drie cijfers tussen haakjes). Dan kunnen we de eachmatch
iterator gebruiken:
julia> for m in eachmatch(phone, text)
println("Matched $(m.match) with area code $(m[1])")
end
Matched (555)-505-1000 with area code 555
Matched (555)-999-9999 with area code 555
Merk op dat we m[1]
omdat het netnummer de eerste vastleggroep is in onze reguliere expressie. We kunnen alle drie de componenten van het telefoonnummer als een tuple krijgen met behulp van een functie:
julia> splitmatch(m) = m[1], m[2], m[3]
splitmatch (generic function with 1 method)
Dan kunnen we een dergelijke functie toepassen op een bepaalde RegexMatch
:
julia> splitmatch(match(phone, text))
("555","505","1000")
Of we kunnen het over elke wedstrijd map
:
julia> map(splitmatch, eachmatch(phone, text))
2-element Array{Tuple{SubString{String},SubString{String},SubString{String}},1}:
("555","505","1000")
("555","999","9999")