Согласование регулярных выражений в PowerShell Есть ли элегантный однострочный слой для выполнения следующих действий? $myMatch = "^abc(.*)" $foo -match $myMatch $myVar = $matches[1] Меня интересует переменная $myVar... Ответ 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
Ответ 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