Julia Language
Регулярные выражения
Поиск…
Синтаксис
- Regex ( "[регулярное выражение]")
- г «[регулярное выражение]»
- матч (игла, стог сена)
- matchall (игла, стога сена)
- eachmatch (игла, стог сена)
- ismatch (игла, стог сена)
параметры
параметр | подробности |
---|---|
needle | Regex искать в haystack |
haystack | текст, в котором нужно искать needle |
Литералы регулярных выражений
Джулия поддерживает регулярные выражения 1 . Библиотека PCRE используется как реализация регулярного выражения. Регулярные выражения похожи на мини-язык внутри языка. Поскольку большинство языков и многие текстовые редакторы предоставляют некоторую поддержку регулярного выражения, документация и примеры того, как использовать регулярное выражение вообще, выходят за рамки этого примера.
Можно построить Regex
из строки с помощью конструктора:
julia> Regex("(cat|dog)s?")
Но для удобства и более простого экранирования вместо этого можно использовать строковый макрос @r_str
:
julia> r"(cat|dog)s?"
1 : Технически, Julia поддерживает регулярные выражения, которые отличаются от и более мощными, чем те, которые называются регулярными выражениями в теории языка. Часто термин «регулярное выражение» также используется для обозначения регулярных выражений.
Поиск матчей
Существует четыре основных полезных функции для регулярных выражений, каждая из которых принимает аргументы в порядке needle, haystack
. Терминология «игла» и «стога сена» исходят из английской идиомы «найти иглу в стоге сена». В контексте регулярных выражений регулярное выражение представляет собой иглу, а текст - стог сена.
Функция match
может использоваться для поиска первого совпадения в строке:
julia> match(r"(cat|dog)s?", "my cats are dogs")
RegexMatch("cats", 1="cat")
Функция matchall
может использоваться для поиска всех совпадений регулярного выражения в строке:
julia> matchall(r"(cat|dog)s?", "The cat jumped over the dogs.")
2-element Array{SubString{String},1}:
"cat"
"dogs"
Функция ismatch
возвращает логическое значение, указывающее, было ли совпадение найдено внутри строки:
julia> ismatch(r"(cat|dog)s?", "My pigs")
false
julia> ismatch(r"(cat|dog)s?", "My cats")
true
eachmatch
функция возвращает итератор над RegexMatch
объектами, пригодный для использования с for
петель :
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
Группы захвата
Подстроки, захваченные группами захвата , доступны из объектов RegexMatch
с использованием нотации индексации.
Например, следующее регулярное выражение анализирует североамериканские телефонные номера, написанные в формате (555)-555-5555
:
julia> phone = r"\((\d{3})\)-(\d{3})-(\d{4})"
и предположим, что мы хотим извлечь телефонные номера из текста:
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"
Используя функцию matchall
, мы можем получить массив подстрок, соответствующих самим себе:
julia> matchall(phone, text)
2-element Array{SubString{String},1}:
"(555)-505-1000"
"(555)-999-9999"
Но предположим, что мы хотим получить доступ к кодам областей (первые три цифры, заключенные в скобки). Затем мы можем использовать итератор 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
Обратите внимание, что мы используем m[1]
потому что код области является первой группой захвата в нашем регулярном выражении. Мы можем получить все три компонента телефонного номера в виде кортежа, используя функцию:
julia> splitmatch(m) = m[1], m[2], m[3]
splitmatch (generic function with 1 method)
Затем мы можем применить такую функцию к определенному RegexMatch
:
julia> splitmatch(match(phone, text))
("555","505","1000")
Или мы могли бы map
его в каждом матче:
julia> map(splitmatch, eachmatch(phone, text))
2-element Array{Tuple{SubString{String},SubString{String},SubString{String}},1}:
("555","505","1000")
("555","999","9999")