수색…


통사론

  • '텍스트'- 'RegExPattern'일치
  • 'text'-replace 'RegExPattern', 'newvalue'
  • [정규식] :: 일치 ( "text", "pattern") # 단일 매치
  • [regex] :: 일치 ( "text", "pattern") # 여러 일치
  • [regex] :: Replace ( "text", "pattern", "newvalue")
  • [정규식] : 바꾸기 ( "text", "pattern", {param ($ m)}) #MatchEvaluator
  • [regex] :: Escape ( "input") # 이스케이프 특수 문자

단일 경기

Regex를 사용하여 텍스트에 특정 패턴이 포함되어 있는지 빠르게 판단 할 수 있습니다. PowerShell에서 Regex를 사용하여 작업하는 방법에는 여러 가지가 있습니다.

#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@

#Sample pattern: Content wrapped in ()
$pattern = '\(.*?\)'

-Match 연산자 사용

문자열이 내장 된 -matches 연산자를 사용하여 패턴과 일치하는지 확인하려면 'input' -match 'pattern' -matches -match 'input' -match 'pattern' 구문을 사용하십시오. 검색 결과에 따라 true 또는 false 를 반환 true . 일치하는 항목이 있으면 $Matches -variable에 액세스하여 일치 항목과 그룹 (패턴으로 정의 된 경우)을 볼 수 있습니다.

> $text -match $pattern
True

> $Matches

Name Value
---- -----
0    (a)  

-match 를 사용하여 문자열 배열을 필터링하고 일치하는 문자열 만 반환 할 수도 있습니다.

> $textarray = @"
This is (a) sample
text, this is
a (sample text)
"@ -split "`n"

> $textarray -match $pattern
This is (a) sample
a (sample text)
2.0

Select-String 사용

PowerShell 2.0에서는 regex를 사용하여 텍스트를 검색하는 새로운 cmdlet을 도입했습니다. match가 들어있는 textinput 당 MatchInfo 객체를 MatchInfo 합니다. 일치하는 그룹 등을 찾기 위해 속성에 액세스 할 수 있습니다.

> $m = Select-String -InputObject $text -Pattern $pattern

> $m

This is (a) sample
text, this is
a (sample text)

> $m | Format-List *

IgnoreCase : True
LineNumber : 1
Line       : This is (a) sample
             text, this is
             a (sample text)
Filename   : InputStream
Path       : InputStream
Pattern    : \(.*?\)
Context    : 
Matches    : {(a)}

-match 와 마찬가지로 Select-String 을 사용하여 배열을 배열하여 문자열 배열을 필터링 할 수도 있습니다. 일치하는 것을 포함하는 문자열 당 MatchInfo -object를 만듭니다.

> $textarray | Select-String -Pattern $pattern

This is (a) sample
a (sample text)

#You can also access the matches, groups etc.
> $textarray | Select-String -Pattern $pattern | fl *


IgnoreCase : True
LineNumber : 1
Line       : This is (a) sample
Filename   : InputStream
Path       : InputStream
Pattern    : \(.*?\)
Context    : 
Matches    : {(a)}

IgnoreCase : True
LineNumber : 3
Line       : a (sample text)
Filename   : InputStream
Path       : InputStream
Pattern    : \(.*?\)
Context    : 
Matches    : {(sample text)}

Select-String-SimpleMatch 스위치를 추가하여 일반 텍스트 패턴 (정규식 없음)을 사용하여 검색 할 수도 있습니다.

[RegEx] :: Match () 사용하기

.NET [RegEx] 클래스에서 사용할 수있는 정적 Match() 메서드를 사용할 수도 있습니다.

> [regex]::Match($text,$pattern)

Groups   : {(a)}
Success  : True
Captures : {(a)}
Index    : 8
Length   : 3
Value    : (a)

> [regex]::Match($text,$pattern) | Select-Object -ExpandProperty Value
(a)

바꾸다

정규 표현식의 일반적인 작업은 패턴과 일치하는 텍스트를 새로운 값으로 대체하는 것입니다.

#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@

#Sample pattern: Text wrapped in ()
$pattern = '\(.*?\)'

#Replace matches with:
$newvalue = 'test'

-Replace 연산자 사용

PowerShell의 -replace 연산자를 사용하면 'input' -replace 'pattern', 'newvalue' 구문을 사용하여 패턴과 일치하는 텍스트를 새 값으로 바꿀 수 있습니다.

> $text -replace $pattern, $newvalue
This is test sample
text, this is
a test

[RegEx] :: Replace () 메서드 사용하기

일치 항목 Replace()[RegEx] .NET 클래스의 Replace() 메서드를 사용하여 수행 할 수도 있습니다.

[regex]::Replace($text, $pattern, 'test')
This is test sample
text, this is
a test

MatchEvalutor를 사용하여 텍스트를 동적 값으로 대체하십시오.

경우에 따라 패턴과 일치하는 값을 특정 일치 항목을 기반으로하는 새 값으로 대체해야 새로운 값을 예측할 수 없게됩니다. 이러한 유형의 시나리오의 경우 MatchEvaluator 가 매우 유용 할 수 있습니다.

PowerShell에서 MatchEvaluator 는 현재 일치하는 Match 개체를 포함하는 단일 매개 변수가있는 스크립트 블록만큼 간단합니다. 동작의 출력은 해당 특정 일치에 대한 새 값입니다. MatchEvalutor[Regex]::Replace() 정적 메서드와 함께 사용할 수 있습니다.

: inside () 텍스트를 길이로 바꾸기

#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
    
#Sample pattern: Content wrapped in ()
$pattern = '(?<=\().*?(?=\))'

$MatchEvalutor = {
    param($match)

    #Replace content with length of content
    $match.Value.Length

}

산출:

> [regex]::Replace($text, $pattern, $MatchEvalutor)

This is 1 sample
text, this is
a 11

예 : 대문자로 sample 만들기

#Sample pattern: "Sample"
$pattern = 'sample'

$MatchEvalutor = {
    param($match)

    #Return match in upper-case
    $match.Value.ToUpper()

}

산출:

> [regex]::Replace($text, $pattern, $MatchEvalutor)

This is (a) SAMPLE
text, this is
a (SAMPLE text)

특수 문자 이스케이프

정규식 패턴은 많은 특수 문자를 사용하여 패턴을 설명합니다. 예., . "임의의 문자"를 의미하고, + 는 "하나 이상의 문자"등을 의미합니다.

이러한 문자를 사용하려면 a . , + 등의 패턴을 사용하면 특수 의미를 제거하기 위해 이스케이프 처리해야합니다. 이것은 정규 표현식에서 백 슬래시 \ 이스케이프 문자를 사용하여 수행됩니다. 예 : + 를 검색하려면 \+ 패턴을 사용합니다.

regex의 모든 특수 문자를 기억하기가 어려울 수 있으므로 검색하려는 문자열의 모든 특수 문자를 이스케이프하려면 [RegEx]::Escape("input") 메서드를 사용할 수 있습니다.

> [regex]::Escape("(foo)")
\(foo\)

> [regex]::Escape("1+1.2=2.2")
1\+1\.2=2\.2

여러 경기

텍스트의 패턴과 일치하는 것을 모두 찾는 여러 가지 방법이 있습니다.

#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@

#Sample pattern: Content wrapped in ()
$pattern = '\(.*?\)'

Select-String 사용

당신은 추가하여 모든 일치 (글로벌 경기)을 찾을 수 있습니다 -AllMatches 스위치를 Select-String .

> $m = Select-String -InputObject $text -Pattern $pattern -AllMatches

> $m | Format-List *

IgnoreCase : True
LineNumber : 1
Line       : This is (a) sample
             text, this is
             a (sample text)
Filename   : InputStream
Path       : InputStream
Pattern    : \(.*?\)
Context    : 
Matches    : {(a), (sample text)}

#List all matches
> $m.Matches

Groups   : {(a)}
Success  : True
Captures : {(a)}
Index    : 8
Length   : 3
Value    : (a)

Groups   : {(sample text)}
Success  : True
Captures : {(sample text)}
Index    : 37
Length   : 13
Value    : (sample text)

#Get matched text
> $m.Matches | Select-Object -ExpandProperty Value
(a)
(sample text)

[RegEx] :: Matches () 사용하기

.NET`[regex] -class의 Matches() 메소드를 사용하여 여러 개의 일치 항목에 대한 전역 검색을 수행 할 수도 있습니다.

> [regex]::Matches($text,$pattern)

Groups   : {(a)}
Success  : True
Captures : {(a)}
Index    : 8
Length   : 3
Value    : (a)

Groups   : {(sample text)}
Success  : True
Captures : {(sample text)}
Index    : 37
Length   : 13
Value    : (sample text)

> [regex]::Matches($text,$pattern) | Select-Object -ExpandProperty Value

(a)
(sample text)


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow