Julia Language
Regexes
Buscar..
Sintaxis
- Regex ("[regex]")
- r "[regex]"
- partido (aguja, pajar)
- matchall (aguja, pajar)
- eachmatch (aguja, pajar)
- ismatch (aguja, pajar)
Parámetros
Parámetro | Detalles |
---|---|
needle | El Regex a buscar en el haystack |
haystack | El texto en el que buscar la needle |
Literales regex
Julia soporta expresiones regulares 1 . La biblioteca PCRE se utiliza como la implementación de expresiones regulares. Las expresiones regulares son como un mini-lenguaje dentro de un idioma. Dado que la mayoría de los idiomas y muchos editores de texto brindan soporte para expresiones regulares, la documentación y los ejemplos de cómo usar expresiones regulares en general están fuera del alcance de este ejemplo.
Es posible construir un Regex
partir de una cadena usando el constructor:
julia> Regex("(cat|dog)s?")
Pero por conveniencia y más fácil de escapar, la macro de cadena @r_str
puede usarse en su lugar:
julia> r"(cat|dog)s?"
1 : Técnicamente, Julia admite expresiones regulares, que son distintas y más poderosas de lo que se llaman expresiones regulares en la teoría del lenguaje. Con frecuencia, el término "expresión regular" se usará para referirse a expresiones regulares también.
Encontrar coincidencias
Existen cuatro funciones principales de utilidad para expresiones regulares, todas las cuales toman argumentos en orden de needle, haystack
. La terminología "aguja" y "pajar" provienen del idioma inglés "encontrar una aguja en un pajar". En el contexto de las expresiones regulares, la expresión regular es la aguja y el texto es el pajar.
La función de match
se puede utilizar para encontrar la primera coincidencia en una cadena:
julia> match(r"(cat|dog)s?", "my cats are dogs")
RegexMatch("cats", 1="cat")
La función matchall
se puede usar para encontrar todas las coincidencias de una expresión regular en una cadena:
julia> matchall(r"(cat|dog)s?", "The cat jumped over the dogs.")
2-element Array{SubString{String},1}:
"cat"
"dogs"
La función ismatch
devuelve un valor booleano que indica si se encontró una coincidencia dentro de la cadena:
julia> ismatch(r"(cat|dog)s?", "My pigs")
false
julia> ismatch(r"(cat|dog)s?", "My cats")
true
El eachmatch
función devuelve un iterador sobre RegexMatch
objetos, adecuado para uso con for
bucles :
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
Grupos de captura
Las subcadenas capturadas por los grupos de captura son accesibles desde los objetos RegexMatch
usando notación de indexación.
Por ejemplo, las siguientes (555)-555-5555
números de teléfono de América del Norte escritos en formato (555)-555-5555
:
julia> phone = r"\((\d{3})\)-(\d{3})-(\d{4})"
y supongamos que deseamos extraer los números de teléfono de un texto:
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"
Usando la función matchall
, podemos obtener una serie de subcadenas que coincidan:
julia> matchall(phone, text)
2-element Array{SubString{String},1}:
"(555)-505-1000"
"(555)-999-9999"
Pero supongamos que queremos acceder a los códigos de área (los tres primeros dígitos, entre paréntesis). Entonces podemos usar el iterador 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
Tenga en cuenta que usamos m[1]
porque el código de área es el primer grupo de captura en nuestra expresión regular. Podemos obtener los tres componentes del número de teléfono como una tupla usando una función:
julia> splitmatch(m) = m[1], m[2], m[3]
splitmatch (generic function with 1 method)
Entonces podemos aplicar dicha función a un RegexMatch
particular:
julia> splitmatch(match(phone, text))
("555","505","1000")
O podríamos map
en cada partido:
julia> map(splitmatch, eachmatch(phone, text))
2-element Array{Tuple{SubString{String},SubString{String},SubString{String}},1}:
("555","505","1000")
("555","999","9999")