Szukaj…


Składnia

  • Regex („[regex]”)
  • r „[regex]”
  • mecz (igła, stóg siana)
  • matchall (igła, stóg siana)
  • eachmatch (igła, stóg siana)
  • ismatch (igła, stóg siana)

Parametry

Parametr Detale
needle Regex należy szukać w haystack
haystack tekst, w którym szukać needle

Literały Regex

Julia obsługuje wyrażenia regularne 1 . Biblioteka PCRE jest używana jako implementacja wyrażenia regularnego. Regeksy są jak mini-język w danym języku. Ponieważ większość języków i wiele edytorów tekstu zapewnia obsługę wyrażeń regularnych, dokumentacja i przykłady ogólnego używania wyrażeń regularnych są poza zakresem tego przykładu.

Możliwe jest zbudowanie Regex z łańcucha przy użyciu konstruktora:

julia> Regex("(cat|dog)s?")

Ale dla wygody i łatwiejszej zmiany @r_str można zamiast tego użyć makra @r_str :

julia> r"(cat|dog)s?"

1 : Z technicznego punktu widzenia Julia obsługuje wyrażenia regularne , które różnią się od tych wyrażeń regularnych w teorii języka i mają większą moc. Często termin „wyrażenie regularne” będzie używany również w odniesieniu do wyrażeń regularnych.

Znajdowanie dopasowań

Istnieją cztery podstawowe przydatne funkcje dla wyrażeń regularnych, z których wszystkie przyjmują argumenty w kolejności needle, haystack . Terminologia „igła” i „stóg siana” pochodzą z angielskiego idiomu „znajdowanie igły w stogu siana”. W kontekście wyrażeń regularnych wyrażeniem regularnym jest igła, a tekst jest stogiem siana.

Za pomocą funkcji match można znaleźć pierwsze dopasowanie w ciągu:

julia> match(r"(cat|dog)s?", "my cats are dogs")
RegexMatch("cats", 1="cat")

Za matchall funkcji matchall można znaleźć wszystkie dopasowania wyrażenia regularnego w ciągu:

julia> matchall(r"(cat|dog)s?", "The cat jumped over the dogs.")
2-element Array{SubString{String},1}:
 "cat" 
 "dogs"

Funkcja ismatch zwraca wartość logiczną wskazującą, czy znaleziono dopasowanie w ciągu:

julia> ismatch(r"(cat|dog)s?", "My pigs")
false

julia> ismatch(r"(cat|dog)s?", "My cats")
true

W eachmatch funkcja zwraca iterację na RegexMatch obiektów, odpowiednie do zastosowania for pętlach :

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

Przechwytuj grupy

RegexMatch przechwycone przez grupy przechwytywania są dostępne z obiektów RegexMatch za pomocą notacji indeksującej.

Na przykład następujące wyrażenie regularne analizuje numery telefonów w Ameryce Północnej zapisane w formacie (555)-555-5555 :

julia> phone = r"\((\d{3})\)-(\d{3})-(\d{4})"

i załóżmy, że chcemy wyodrębnić numery telefonów z tekstu:

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"

Za pomocą funkcji matchall możemy uzyskać tablicę dopasowanych podciągów:

julia> matchall(phone, text)
2-element Array{SubString{String},1}:
 "(555)-505-1000"
 "(555)-999-9999"

Przypuśćmy jednak, że chcemy uzyskać dostęp do numerów kierunkowych (pierwsze trzy cyfry ujęte w nawiasy). Następnie możemy użyć iteratora eachmatch :

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

Zauważ, że używamy m[1] ponieważ numer kierunkowy jest pierwszą grupą przechwytywania w naszym wyrażeniu regularnym. Możemy uzyskać wszystkie trzy elementy numeru telefonu jako krotkę za pomocą funkcji:

julia> splitmatch(m) = m[1], m[2], m[3]
splitmatch (generic function with 1 method)

Następnie możemy zastosować taką funkcję do konkretnego RegexMatch :

julia> splitmatch(match(phone, text))
("555","505","1000")

Lub możemy map go dla każdego meczu:

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow