Last active
August 29, 2015 14:24
-
-
Save DmitriyVlasov/b79b19687b3fd629a68e to your computer and use it in GitHub Desktop.
Примеры использования FSharp.Text.RegexProvider
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(** # Примеры использования 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