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)
RSS комментарии
Обратная ссылка
Сергей Сергеевич, с вами как то можно связаться? есть вопрос к Вам по поводу перемещаемых профилей в DFS
Сергей » почта sergey.s.betke@yandex.ru. По быстрому можно по скайпу sergey.s.betke.