Skip to content

Instantly share code, notes, and snippets.

@DmitriyVlasov
Last active August 29, 2015 14:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DmitriyVlasov/b79b19687b3fd629a68e to your computer and use it in GitHub Desktop.
Save DmitriyVlasov/b79b19687b3fd629a68e to your computer and use it in GitHub Desktop.
Примеры использования FSharp.Text.RegexProvider
(** # Примеры использования FSharp.Text.RegexProvider*)
(** ## Проверка ссылок на F#*)
(** Следующий скрипт выводит информацию о ссылках в html-коде, хранящемся в переменной html.
Скрипт портирован из примера в книге Д. Фридл, Регулярные выражения стр. 257 *)
open System.Text.RegularExpressions
open FSharp.Text.RegexProvider
[<Literal>]
let aTagPattern =
@"<a\b(?<Guts>[^>]+)>(?<Link>.*?)</a>"
[<Literal>]
let gutsPattern =
"""
\b href (?# атрибут 'href' )
\s* = \s* (?# '=' с необязательными пробелами )
(?: (?# Значение представляет собой... )
"(?<Url>[^"]*)" (?# строку в кавычках, )
| (?# или... )
'(?<Url>[^']*)' (?# строку в апострофах, )
| (?# или... )
(?<Url>[^'">\s]+) (?# прочие символы )
) (?# )
"""
type ATagRegex = Regex< aTagPattern >
type GutsRegex = Regex< gutsPattern >
let html = String.paste()
let regexOptions =
RegexOptions.IgnoreCase |||
RegexOptions.IgnorePatternWhitespace
let aTagChecks = ATagRegex(regexOptions).Matches(html)
for aTagCheck in aTagChecks do
let urlCheck = GutsRegex(regexOptions).Match(aTagCheck.Guts.Value)
if urlCheck.Success then
printfn "Url '%s' witch link '%s'" urlCheck.Url.Value aTagCheck.Link.Value
(** #Обработка данных в формате CSV*)
(** Следующий скрипт конвертирует текстовую строку в формате CSV в двухмерный массив строк.
Скрипт портирован из примера в книге Д. Фридл, Регулярные выражения стр. 273 *)
open System.Text.RegularExpressions
open FSharp.Text.RegexProvider
[<Literal>]
let fieldPattern =
"""
(?:^|,)
(?:
\s*
# Для поля в кавычках...
" # открывающая кавычка
(?<Quoted> (?> [^"]+ | "" )* )
" # закрывающая кавычка
# ... или ...
|
# ... любой текст, не сожержащий кавычки и запятые...
(?<Naked>[^",]*)
)
"""
type FieldRegex = Regex<fieldPattern>
let parseLine line =
let regexOptions = RegexOptions.IgnorePatternWhitespace
let fieldMatches = FieldRegex(regexOptions).Matches(line)
[|for fieldMatch in fieldMatches do
if fieldMatch.Quoted.Success then
yield fieldMatch.Quoted.Value
else
yield fieldMatch.Naked.Value|]
let parseCSV file =
file
|> String.splitMany [|"\r\n";"\n";Environment.NewLine|]
|> Array.map parseLine
"""
1,A,,"Документ-1"
2,B,,"Документ-2"
3,C,,"Документ-3"
4,D,,"Документ-4"
5,E,,"Документ-5"
"""
|> parseCSV
|> Array.map (flip Array.get 0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment