Статья размещена автором Бетке Сергей Сергеевич

PowerShell: RegExp, Matches() и множество результатов

Сегодня потратил некоторое время на то, чтобы выделить несколько фрагментов текста, соответствующего регулярному выражению, и именованные группы в каждом из них. Ну и решил записать, чтобы не забыть.

[System.Text.RegularExpressions.Regex]$reDomain = `
    "(?<domain>(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+(?:aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|[a-zA-Z]{2}))";
[System.Text.RegularExpressions.Regex]$rePort = `
    "(?:[:](?<port>\d+))";
[System.Text.RegularExpressions.Regex]$reSocket = `
    "(?<socket>${reDomain}${rePort}?)";
[System.Text.RegularExpressions.Regex]$reSchema = `
    "(?<schema>http|https|ftp)";
[System.Text.RegularExpressions.Regex]$reURLToken = `
    "(?:(?:%[0-9a-fA-F]{2})|[a-zA-Z0-9!$'*+^_`{|}~.`-]|&[a-z]+;)";
[System.Text.RegularExpressions.Regex]$reURLPathEl = `
    "${reURLToken}+";
[System.Text.RegularExpressions.Regex]$reURLPath = `
    "(?<path>${reURLPathEl}(?:/${reURLPathEl})*)";
[System.Text.RegularExpressions.Regex]$reURLParam = `
    "(?<paramName>${reURLToken}+)=(?<paramValue>${reURLToken}+)";
[System.Text.RegularExpressions.Regex]$reURLParams = `
    "(?:(?:[?])(?<params>${reURLParam}(?:&${reURLParam})*))";
[System.Text.RegularExpressions.Regex]$reURLAnchor = `
    "(?:(?:#)(?<anchor>${reURLToken}+))";
[System.Text.RegularExpressions.Regex]$reURL = `
    "(?<url>${reSchema}://${reDomain}${rePort}?(?:/${reURLPath}?${reURLParams}?${reURLAnchor}?)?)";

# выражение для поиска определений типа
# [test]: <http://novgaro.ru> "заголовок такой"  
$reMDRef = New-Object System.Text.RegularExpressions.Regex -ArgumentList `
    "(?<=^\s*)\[(?<id>\w+)\]:\s+(?:<$reURL>|$reURL)\s+(?:'(?<title>.+?)'|`"(?<title>.+?)`"|\((?<title>.+?)\))(?=\s*$)" `
    , ( [System.Text.RegularExpressions.RegexOptions]::IgnoreCase `
        -bor [System.Text.RegularExpressions.RegexOptions]::Multiline `
    ) `
;
$reMDRef.Matches( @"
   ddddd
  [test]: <http://novgaro.ru> "заголовок такой"  
zzzzz
  [test2]: <http://novgaro2.ru> "заголовок2 такой"  
zвzвzвzвzв
  [test3]: <http://novgaro3.ru> "заголовок3 такой"  
"@
) `
| % { $_.Groups['id'].Value } `
;

test
test2
test3

В общем, суть в том, что для выделения именованных групп захвата для конкретного вхождения регулярного выражения следует использовать код:

$reMDRef.Matches( $sourceMultiString )['номер вхождения регулярного выражения'].Groups['имя именованной группы захвата'].Value;

На этом всё на сегодня.

Отзывы » (2)

  1. Сергей:

    Сергей Сергеевич, с вами как то можно связаться? есть вопрос к Вам по поводу перемещаемых профилей в DFS

Опубликовать комментарий

XHTML: Вы можете использовать следующие HTML теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tags Связь с комментариями статьи:
RSS комментарии
Обратная ссылка