Поиск…


Синтаксис

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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow