Подтвердить что ты не робот

Согласование регулярных выражений в PowerShell

Есть ли элегантный однострочный слой для выполнения следующих действий?

$myMatch = "^abc(.*)"
$foo -match $myMatch
$myVar = $matches[1]

Меня интересует переменная $myVar...

4b9b3361

Ответ 1

Просто используйте -replace:

$foo = 'abcDEF'
$myMatch = "^abc(.*)"
$myVar = $foo -replace $myMatch,'$1'
#$myVar contains DEF

Ответ 2

Я часто использую что-то вроде следующего:

([regex]"^abc(.*)").match($foo).groups[1].value

Это не очень PowerShell-y, или, по крайней мере, не очень PowerShell V2-y (мы возвращаемся к классу .NET)... но он довольно компактный.

Ответ 3

Измененный ответ после уточнения:

True однострочный:

$myvar = ($foo | ? {$_ -match $myMatch} | select @{L="Matches";E={$matches[1]}}).matches

Поддельный однострочный:

$foo | ? {$_ -match $myMatch} ; $myvar = $matches[1]

Ответ 4

Я не уверен в элегантности, но вот что-то полезное:

PS > "123.134" -match "(?<P1>[0-9]{3})\.(?<P2>[0-9]{3})"
True
PS > $Matches

Name                           Value
----                           -----
P2                             134
P1                             123
0                              123.134


PS > $Matches["P1"]
123

?<P1> дает метку P1 для первого захвата. Это помогает понять.

PS > ([regex]("(?<P1>[0-9]{3})\.(?<P2>[0-9]{3})")).matches("123.123")[0].groups["P1"].value
123

В вашем случае:

PS > $foo = "123.143"
PS > ([regex]("(?<P1>[0-9]{3})\.(?<P2>[0-9]{3})")).matches($foo)[0].groups["P1"].value
123
PS > ([regex]("(?<P1>[0-9]{3})\.(?<P2>[0-9]{3})")).matches($foo)[0].groups["P2"].value
143