programing

PowerShell의 정규식 일치

bestprogram 2023. 10. 4. 22:12

PowerShell의 정규식 일치

다음을 수행할 수 있는 우아한 원라이너가 있습니까?

$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 클래스)...하지만 꽤나 콤팩트합니다.

해명 후 답변 변경:

진정한 원-라이너:

$myvar = ($foo | ? {$_ -match $myMatch} | @{L="Matches" 선택;E={$matches[1]})). 일치합니다.

가짜 원라이너:

$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

기능으로 포장합니다.

이것은 만약 여러분이 이미 효과적인 해결책에 만족하고 이해하고 있지만 더 짧은 해결책이 필요하다면 거의 항상 맞는 답입니다.함수 이름이 제대로 지정되면 자체 문서화 및 재사용 코드 생성도 시작됩니다.뭐가 더 좋을까요?

더 우아하거나 효율적인 솔루션을 찾을 수 있다고 확신하더라도 먼저 기능 호출을 할 수 있고 다른 솔루션이 나오면 한 곳에서 변경하기만 하면 됩니다. 바로 기능 정의 자체입니다.그런 다음 다양한 옵션을 연결하고 꺼내어 모든 사용 사례에 대해 신뢰성을 직접 테스트할 수도 있습니다.뭐가 더 좋을까요?

다른 사람들은 함수 호출 오버헤드에 대해 불평할 수 있지만 이것은 실제로 적절한 개발 단계도 아니고 그것에 대해 걱정할 만한 유형이나 프로그래밍 언어도 아닙니다.앞으로 "귀여운" 원라이너에 대한 실패한 시도를 디버깅하는 것은 항상 훌륭한 클린 기능 호출의 비용을 능가할 것입니다.클린 함수 호출 API에 대한 좋은 결정은 나중에 함수를 클래스 메소드로 전환할 수 있으며 클래스 자체가 높은 수준의 캐싱 및 최적화 기술을 원활하게 랩핑할 수 있습니다.함수 호출의 하위 레벨 최적화는 하위 레벨 언어에 맡겨야 합니다.

언급URL : https://stackoverflow.com/questions/5881573/regular-expression-matching-in-powershell