Соответствие регулярных выражений в PowerShell - PullRequest
20 голосов
/ 04 мая 2011

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

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

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

Ответы [ 5 ]

22 голосов
/ 04 мая 2011

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

$foo = 'abcDEF'
$myMatch = "^abc(.*)"
$myVar = $foo -replace $myMatch,'$1'
#$myVar contains DEF
17 голосов
/ 05 мая 2011

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

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

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

3 голосов
/ 04 мая 2011

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

Правда однострочная:

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

Поддельная однострочная:

$foo | ? {$_ -match $myMatch} ; $myvar = $matches[1]
2 голосов
/ 04 мая 2011

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

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
0 голосов
/ 11 ноября 2018

Оберните это в функцию.

Это почти всегда правильный ответ, если вы уже довольны и понимаете рабочее решение, но хотите, чтобы оно было короче. Если функция названа правильно, она также начинает создавать самодокументируемый и повторно используемый код. Что может быть лучше?

Даже если вы уверены, что есть более элегантное или эффективное решение, которое вы можете найти - вы все равно можете сначала сделать его вызовом функции, а затем, если появится другое решение, вам нужно всего лишь изменить его в одном месте - само определение функции. Вы даже можете подключить и отключить различные варианты, чтобы проверить надежность в каждом конкретном случае. Что может быть лучше?

Другие могут жаловаться на накладные расходы при вызове функции, но на самом деле это не та стадия разработки, которая является подходящим типом или языком программирования. Отладка неудачной попытки «симпатичной» однолинейной работы в будущем всегда будет перевешивать стоимость красивого, чистого вызова функции. Хорошие решения о чистом API-интерфейсе вызова функций могут позже превратить функции в методы класса, а сами классы могут легко объединить методы кэширования и оптимизации высокого уровня. Оптимизацию вызовов функций на более низком уровне следует оставить языкам нижнего уровня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...