Ответ 1
Просто используйте -replace
:
$foo = 'abcDEF'
$myMatch = "^abc(.*)"
$myVar = $foo -replace $myMatch,'$1'
#$myVar contains DEF
Есть ли элегантный однострочный слой для выполнения следующих действий?
$myMatch = "^abc(.*)"
$foo -match $myMatch
$myVar = $matches[1]
Меня интересует переменная $myVar
...
Просто используйте -replace
:
$foo = 'abcDEF'
$myMatch = "^abc(.*)"
$myVar = $foo -replace $myMatch,'$1'
#$myVar contains DEF
Я часто использую что-то вроде следующего:
([regex]"^abc(.*)").match($foo).groups[1].value
Это не очень PowerShell-y, или, по крайней мере, не очень PowerShell V2-y (мы возвращаемся к классу .NET)... но он довольно компактный.
Измененный ответ после уточнения:
True однострочный:
$myvar = ($foo | ? {$_ -match $myMatch} | select @{L="Matches";E={$matches[1]}}).matches
Поддельный однострочный:
$foo | ? {$_ -match $myMatch} ; $myvar = $matches[1]
Я не уверен в элегантности, но вот что-то полезное:
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