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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow