about_Regular_Expressions

간단한 설명

PowerShell의 정규식을 설명합니다.

자세한 설명

참고 항목

이 문서에서는 PowerShell에서 정규식을 사용하기 위한 구문과 메서드를 보여 줍니다. 모든 구문에 대해서는 설명하지 않습니다. 자세한 참조 는 정규식 언어 - 빠른 참조를 참조하세요.

정규식은 텍스트와 일치하는 데 사용되는 패턴입니다. 리터럴 문자, 연산자 및 기타 구문으로 구성할 수 있습니다.

이 문서에서는 PowerShell의 정규식 구문을 보여 줍니다. PowerShell에는 정규식을 사용하는 여러 연산자와 cmdlet이 있습니다. 해당 구문 및 사용에 대한 자세한 내용은 아래 링크에서 확인할 수 있습니다.

PowerShell 정규식은 기본적으로 대/소문자를 구분하지 않습니다. 위에 표시된 각 메서드는 대/소문자 구분을 강제 적용하는 다른 방법을 가지고 있습니다.

  • 의 경우 Select-StringCaseSensitive 매개 변수를 사용합니다.
  • 정규식을 사용하는 연산자의 경우 대/소문자를 구분하는 버전을 -cmatch-creplace사용합니다.-csplit
  • 문의 switch 경우 이 옵션을 사용합니다 -casesensitive .

문자 리터럴

정규식은 리터럴 문자 또는 문자열일 수 있습니다. 이 식은 엔진이 정확히 지정된 텍스트와 일치하도록 합니다.

# This statement returns true because book contains the string "oo"
'book' -match 'oo'

문자 클래스

문자 리터럴은 정확한 패턴을 알고 있으면 작동하지만 문자 클래스를 사용하면 덜 구체적일 수 있습니다.

문자 그룹

[character group] 를 사용하면 한 번에 임의의 수의 문자를 일치시킬 수 있지만 [^character group] 그룹에 없는 문자만 일치시킬 수 있습니다.

# This expression returns true if the pattern matches big, bog, or bug.
'big' -match 'b[iou]g'

일치하는 문자 목록에 하이픈 문자(-)가 포함된 경우 목록의 시작 또는 끝에 있어야 문자 범위 식과 구분할 수 있습니다.

문자 범위

패턴은 문자 범위일 수도 있습니다. 문자는 알파벳 [A-Z], 숫자 [0-9]또는 ASCII 기반 [ -~] (모든 인쇄 가능한 문자)일 수 있습니다.

# This expression returns true if the pattern matches any 2 digit number.
42 -match '[0-9][0-9]'

숫자

문자 클래스는 \d 소수 자릿수와 일치합니다. 반대로 소수 \D 자릿수가 아닌 모든 숫자와 일치합니다.

# This expression returns true if it matches a server name.
# (Server-01 - Server-99).
'Server-01' -match 'Server-\d\d'

Word 문자

문자 클래스는 \w 모든 단어 문자 [a-zA-Z_0-9]와 일치합니다. 단어가 아닌 문자와 일치하려면 .를 사용합니다 \W.

# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'

와일드카드

마침표(.)는 정규식의 야생카드 문자입니다. 줄 새로 고리(\n)를 제외한 모든 문자와 일치합니다.

# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'

공백

공백 문자를 문자 클래스와 일치시킬 \s 수 있습니다. 공백이 아닌 문자를 .와 \S일치시킬 수 있습니다. 리터럴 공백 문자를 .와 일치시킬 수 있습니다.

# This expression returns true.
# The pattern uses the whitespace character class to match the leading
# space and a literal space to matching the trailing space.
' - ' -match '\s- '

수량자

수량자는 입력 문자열에 있어야 하는 각 요소의 인스턴스 수를 제어합니다.

다음은 PowerShell에서 사용할 수 있는 몇 가지 수량자입니다.

수량자 설명
* 0회 이상.
+ 한 번 이상.
? 0회 또는 1회.
{n,m} 적어도 n, 하지만 더 이상 m 시간.

별표(*)는 이전 요소와 0번 이상 일치합니다. 그 결과 요소가 없는 입력 문자열도 일치합니다.

# This returns true for all account name strings even if the name is absent.
'ACCOUNT NAME:    Administrator' -match 'ACCOUNT NAME:\s*\w*'

더하기 기호(+)는 이전 요소와 한 번 이상 일치합니다.

# This returns true if it matches any server name.
'DC-01' -match '[A-Z]+-\d\d'

물음표 ? 는 이전 요소 0 또는 한 번과 일치합니다. 별표 *와 마찬가지로 요소가 없는 문자열도 일치합니다.

# This returns true for any server name, even server names without dashes.
'SERVER01' -match '[A-Z]+-?\d\d'

{n, m} 수량자는 수량자를 세분화하여 제어할 수 있도록 여러 가지 방법으로 사용할 수 있습니다. 두 번째 요소 m 와 쉼표 , 는 선택 사항입니다.

수량자 설명
{n} 정확히 n 횟수와 일치합니다.
{n,} 적어도 n 횟수만큼 일치합니다.
{n,m} 횟수와 m 일치 n 합니다.
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'

기준 위치

앵커를 사용하면 입력 문자열 내의 일치 위치에 따라 일치 항목이 성공하거나 실패할 수 있습니다.

일반적으로 사용되는 두 앵커는 다음과 $같습니다^. 이 캐리트는 ^ 문자열의 시작 부분과 일치하며 $문자열의 끝과 일치합니다. 앵커를 사용하면 특정 위치에서 텍스트를 일치시키는 동시에 원치 않는 문자를 카드 수 있습니다.

# The pattern expects the string 'fish' to be the only thing on the line.
# This returns FALSE.
'fishing' -match '^fish$'

참고 항목

앵커가 포함된 $ regex를 정의할 때 큰따옴표() 대신" 작은따옴표(')를 사용하여 regex를 묶어야 합니다. 그렇지 않으면 PowerShell에서 식을 변수로 확장합니다.

PowerShell에서 앵커를 사용하는 경우 단일 줄과 여러 줄 정규식 옵션의 차이점을 이해해야 합니다.

  • 여러 줄: 여러 줄 모드가 강제로 ^ 적용되고 $ 입력 문자열의 시작과 끝 대신 모든 LINE의 시작 끝과 일치합니다.
  • 단일 줄: 단일 줄 모드는 입력 문자열을 SingleLine으로 처리합니다. 줄 바꿈을 . 제외한 \n모든 문자를 일치시키는 대신 문자가 모든 문자(줄 바꿈 포함)를 일치하도록 합니다.

이러한 옵션 및 사용 방법에 대해 자세히 알아보려면 정규식 언어 - 빠른 참조방문하세요.

문자 이스케이프

백슬래시(\)는 정규식 엔진에서 구문 분석되지 않도록 문자를 이스케이프하는 데 사용됩니다.

예약된 문자는 다음과 같습니다 []().\^$|?*+{}.

입력 문자열에서 일치하도록 패턴에서 이러한 문자를 이스케이프해야 합니다.

# This returns true and matches numbers with at least 2 digits of precision.
# The decimal point is escaped using the backslash.
'3.141' -match '3\.\d{2,}'

텍스트를 이스케이프할 수 있는 regex 클래스의 정적 메서드가 있습니다.

[regex]::escape('3.\d{2,}')
3\.\\d\{2,}

참고 항목

이렇게 하면 문자 클래스에 사용되는 기존 백슬래시를 포함하여 예약된 모든 정규식 문자를 이스케이프합니다. 이스케이프해야 하는 패턴 부분에만 사용해야 합니다.

기타 문자 이스케이프

특수 문자 형식을 일치시키는 데 사용할 수 있는 예약된 문자 이스케이프도 있습니다.

다음은 일반적으로 사용되는 몇 가지 문자 이스케이프입니다.

문자 이스케이프 설명
\t 탭 일치
\n 줄 줄 일치
\r 캐리지 리턴과 일치

그룹, 캡처 및 대체

그룹화 구문은 입력 문자열을 캡처하거나 무시할 수 있는 부분 문자열로 구분합니다. 그룹화된 부분 문자열을 하위 식이라고 합니다. 기본적으로 하위 식은 번호가 매겨진 그룹으로 캡처되지만 이름을 할당할 수도 있습니다.

그룹화 구문은 괄호로 둘러싸인 정규식입니다. 묶은 정규식과 일치하는 모든 텍스트가 캡처됩니다. 다음 예제에서는 입력 텍스트를 두 개의 캡처링 그룹으로 나눕니다.

'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True

$MatchesHashtable 자동 변수를 사용하여 캡처된 텍스트를 검색합니다. 전체 일치 항목을 나타내는 텍스트가 키 0에 저장됩니다. 해시 테이블은 일치하는 패턴의 첫 번째 항목만 포함한다는 점에 유 $Matches 의해야 합니다.

$Matches.0
The last logged on user was CONTOSO\jsmith

캡처는 왼쪽에서 오른쪽으로 증가하는 숫자 수 키에 저장됩니다. 캡처 1 는 사용자 이름까지 모든 텍스트를 포함하고 캡처 2 에는 사용자 이름만 포함됩니다.

$Matches
Name           Value
----           -----
2              CONTOSO\jsmith
1              The last logged on user was
0              The last logged on user was CONTOSO\jsmith

Important

키는 0입니다. 해시 테이블 메서드를 사용하여 저장된 값에 액세스할 수 있습니다.

PS> 'Good Dog' -match 'Dog'
True

PS> $Matches[0]
Dog

PS> $Matches.Item(0)
Dog

PS> $Matches.0
Dog

명명된 캡처

기본적으로 캡처는 왼쪽에서 오른쪽으로 오름차순으로 저장됩니다. 캡처링 그룹에 이름을 할당할 수도 있습니다. 이 이름은 해시 테이블 자동 변수의 $Matches키가 됩니다.

캡처링 그룹 내에서 캡처된 데이터를 명명된 키 아래에 저장하는 데 사용합니다 ?<keyname> .

PS> $string = 'The last logged on user was CONTOSO\jsmith'
PS> $string -match 'was (?<domain>.+)\\(?<user>.+)'
True

PS> $Matches

Name                           Value
----                           -----
domain                         CONTOSO
user                           jsmith
0                              was CONTOSO\jsmith

PS> $Matches.domain
CONTOSO

PS> $Matches.user
jsmith

다음 예제에서는 Windows 보안 로그에 최신 로그 항목을 저장합니다. 제공된 정규식은 메시지에서 사용자 이름과 do기본 추출하고 이름에 대한 N 키와 할 일용 D기본 아래에 저장합니다.

$log = (Get-WinEvent -LogName Security -MaxEvents 1).message
$r = '(?s).*Account Name:\s*(?<N>.*).*Account Domain:\s*(?<D>[A-Z,0-9]*)'
$log -match $r
True
$Matches
Name                           Value
----                           -----
D                              CONTOSO
N                              jsmith
0                              A process has exited....

자세한 내용은 정규식의 그룹화 구문을 참조 하세요.

정규식의 대체

정규식(regex) -replace 을 연산자에 사용하면 캡처된 텍스트를 사용하여 텍스트를 동적으로 바꿀 수 있습니다.

<input> -replace <original>, <substitute>

  • <input>: 검색할 문자열입니다.
  • <original>: 입력 문자열을 검색하는 데 사용되는 정규식입니다.
  • <substitute>: 입력 문자열에 있는 일치 항목을 대체할 정규식 대체 식입니다.

피연산자 및 <substitute> 피연산자는 문자 이 <original> 스케이프 또는 대체 식과 같은 정규식 엔진의 규칙이 적용됩니다. 바꾸기 패턴은 리터럴 문자와 하나 이상의 대체로 구성될 수 있습니다.

그룹 식별자 앞에 있는 문자를 사용하여 $ 문자열에서 <substitute> 캡처 그룹을 참조할 수 있습니다.

캡처 그룹을 참조하는 두 가지 방법은 NumberName입니다.

  • 숫자- 캡처링 그룹은 왼쪽에서 오른쪽으로 번호가 매겨집니다.

    'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
    
    John.D.Smith@contoso.com
    
  • 이름- 캡처 그룹은 이름으로 참조할 수도 있습니다.

    'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'
    
    FABRIKAM\Administrator
    

식은 $& 일치하는 모든 텍스트를 나타냅니다.

'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble

Warning

$ 문자열 확장에 문자가 사용되므로 대체와 함께 리터럴 문자열을 사용하거나 큰따옴표를 사용할 때 문자를 이 $ 스케이프해야 합니다.

'Hello World' -replace '(\w+) \w+', '$1 Universe'
"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe
Hello Universe

또한 리터럴 문자로 사용 $ 하려면 일반 이스케이프 문자 대신 사용합니다 $$ . 큰따옴표를 사용하는 경우 잘못된 대체를 방지하기 위해 모든 인스턴스를 $ 이스케이프합니다.

'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72

대체 식에 대한 자세한 내용은 정규식의 대체를 참조 하세요.

참고 항목