이 글은 도움말을 번역한 내용입니다.
이 섹션에서는 정규 표현식의 개념을 소개하고 생성하고 사용하는 방법을 설명합니다.
정규 표현식은 본문 텍스트를 검색할 때 일치시킬 하나 이상의 문자열을 설명합니다. 이 식은 비교할 텍스트와 문자 패턴으로 동작합니다. 정규 표현식을 사용하여 문자열에서 패턴을 검색하고 텍스트를 대체하며 부분 문자열을 추출할 수 있습니다.
이 섹션 내용
정규 표현식 사용
일반적인 검색 및 바꾸기 작업에서는 검색 중인 정확한 텍스트를 제공해야 합니다. 이 기술은 정적 텍스트에서 간단한 검색 및 바꾸기 작업에 적합할 수 있지만 유연성이 부족하고 동적 텍스트 검색을 불가능하지는 않더라도 어렵게 만듭니다.
정규 표현식의 유연성
정규식을 사용하여 다음을 수행할 수 있습니다.
● 문자열 내에서 패턴을 테스트합니다. 예를 들어 전화 번호 패턴이나 신용 카드 번호 패턴이 문자열 내에서 발생하는지 확인하기 위해 입력 문자열을 테스트할 수 있습니다. 이를 데이터 유효성 검사라고 합니다.
● 텍스트를 교체합니다. 정규식을 사용하여 문서의 특정 텍스트를 식별하고 완전히 제거하거나 다른 텍스트로 바꿀 수 있습니다.
● 패턴 일치를 기반으로 문자열에서 하위 문자열을 추출합니다. 문서 또는 입력 필드 내에서 특정 텍스트를 찾을 수 있습니다.
예를 들어, 일부 오래된 자료를 제거하고 일부 HTML 서식 태그를 교체하기 위해 전체 웹 사이트를 검색해야 하는 경우 정규 표현식을 사용하여 각 파일을 테스트하여 찾고 있는 자료 또는 HTML 서식 태그가 존재하는지 확인할 수 있습니다. 그 파일. 이렇게 하면 영향을 받는 파일을 제거하거나 변경해야 하는 자료가 포함된 파일로만 좁힐 수 있습니다. 그런 다음 정규식을 사용하여 오래된 자료를 제거하고 마지막으로 정규식을 사용하여 교체가 필요한 태그를 검색하고 교체할 수 있습니다.
정규식이 유용한 또 다른 예는 문자열 처리 능력이 알려지지 않은 언어에서 발생합니다. Visual Basic의 하위 집합인 VBScript에는 다양한 문자열 처리 기능이 있습니다. C와 마찬가지로 JScript는 그렇지 않습니다. 정규식은 JScript의 문자열 처리를 크게 개선합니다. 그러나 정규 표현식은 VBScript에서도 사용하기에 더 효율적일 수 있으므로 단일 표현식에서 여러 문자열 조작을 수행할 수 있습니다.
정규 표현식 생성
정규식은 텍스트 본문을 검색할 때 일치시킬 하나 이상의 문자열을 설명합니다. 정규식은 검색 중인 텍스트와 비교할 문자 패턴 역할을 합니다.
정규 표현식은 산술 표현식이 생성되는 것과 매우 유사하게 구성됩니다. 작은 표현식은 다양한 메타 문자와 연산자를 사용하여 결합되어 더 큰 표현식을 만듭니다.
정규식의 구성 요소는 개별 문자, 문자 집합, 문자 범위 또는 문자 간의 선택이 될 수 있습니다. 구성 요소는 이러한 구성 요소의 조합일 수도 있습니다.
정규식 구성
한 쌍의 구분 기호 사이에 식의 다양한 구성 요소를 넣어 정규식을 구성합니다. VBScript에서 구분 기호는 다음 예제와 같이 한 쌍의 큰따옴표("") 문자입니다.
"expression"
정규 표현식의 예
다음 표에는 일반적인 정규 표현식의 예가 포함되어 있습니다.
일반 문자
정규식의 가장 간단한 형식은 검색된 문자열과 비교되는 단일 일반 문자입니다. 예를 들어 단일 문자 정규식 "A"는 검색된 문자열에 나타나는 모든 문자 A와 일치합니다.
다음은 VBScript 단일 문자 정규식의 몇 가지 예입니다.
"a"
"7"
"M"
여러 개의 단일 문자를 결합하여 더 긴 표현식을 만들 수 있습니다. 예를 들어 "the" 표현식은 "the", "there", "other" 및 "over the lazy dog"와 같은 검색된 문자열에서 "the"와 일치합니다.
연결 연산자가 필요하지 않습니다. 필요한 것은 문자를 하나씩 입력하는 것뿐입니다.
메타문자
정규식 패턴에는 일반 문자 외에도 메타문자가 포함될 수 있습니다 . 메타 문자의 예로는 숫자 문자와 일치하는 \d가 있습니다.
일반 문자는 명시적으로 메타 문자로 지정되지 않은 모든 인쇄 가능한 문자와 인쇄 불가능한 문자로 구성됩니다. 여기에는 모든 대문자 및 소문자 알파벳 문자, 모든 숫자, 모든 문장 부호 및 일부 기호가 포함됩니다.
메타 문자 목록은 아래 링크를 참고하세요.
Regular Expression Syntax (Scripting)
Table of contents Regular Expression Syntax (Scripting) Article 07/17/2015 In this article --> A regular expression describes one or more strings to match when you search a body of text. The expression serves as a template for matching a character pattern
learn.microsoft.com
모든 문자 일치
마침표 문자(.)는 줄 바꿈 문자(\n)를 제외하고 문자열의 인쇄 또는 인쇄되지 않는 단일 문자와 일치합니다.
VBScript의 "ac"는 "aac", "abc", "acc", "adc", "a1c", "a2c", "ac" 및 "a#c"와 일치합니다.
검색된 문자열에 포함된 마침표(.)를 일치시키려면 정규식의 마침표 앞에 백슬래시(\) 문자를 추가할 수 있습니다.
VBScript의 "filename\.ext"는 "filename.ext"와 일치합니다.
일치하는 문자 목록
하나 이상의 개별 문자를 대괄호 [ ]로 묶어 일치하는 문자 목록을 만들 수 있습니다.
대괄호 표현식으로 묶인 모든 문자는 정규 표현식에서 대괄호 표현식이 나타나는 위치에 있는 단일 문자와만 일치합니다. 예를 들어 VBScript의 "Chapter [12345]" 표현식은 "Chapter 1", "Chapter 2", "Chapter 3", "Chapter 4" 및 "Chapter 5"와 일치합니다.
문자 자체 대신 범위를 사용하여 일치하는 문자를 표현하려면 하이픈(-) 문자를 사용할 수 있습니다.
VBScript의 "Chapter [1-5]" 표현식은 "Chapter [12345]"와 동일합니다.
목록 시작 부분에 캐럿(^) 문자를 포함하여 목록이나 범위에 없는 모든 문자를 찾을 수 있습니다.
예를 들어 VBScript의 [^aAeEiIoOuU] 식은 모음이 아닌 모든 문자와 일치합니다.
자세한 내용은 일치하는 문자 목록에서 설명합니다.
수량자
수량자를 사용하여 문자나 문자 집합이 특정 횟수만큼 반복되는 정규식을 지정할 수 있습니다.
수량자는 수량자의 바로 이전 표현식(수량자의 왼쪽)을 가리킵니다.
한정자는 중괄호 {}로 묶여 있으며, 하한 및 상한 발생 한도에 대한 숫자 값이 포함됩니다. 예를 들어 c{1,2}는 문자 c의 발생 횟수가 1회 또는 2회인 것과 일치합니다.
하나의 숫자만 지정되면 쉼표로 구분되지 않는 한 상한 값으로 사용됩니다. 예를 들어 c{3}는 문자 c의 발생 횟수가 정확히 3회와 일치하며, c{5,}은 문자 c의 발생 횟수가 5회 이상인 것과 일치합니다.
다음 표와 같이 단일 문자 한정 기호도 사용할 수 있습니다.
다음은 일치하는 검색 문자열과 함께 몇 가지 샘플 표현식입니다.
자세한 내용은 수량자에서 설명합니다.
줄과 단어 경계
앵커를 사용 하면 일치 항목을 구성하기 위해 정규식이 검색된 문자열의 시작이나 끝 또는 검색된 문자열의 줄이나 단어의 시작이나 끝에 나타나야 함을 지정할 수 있습니다. 자세한 내용은 앵커에서 설명합니다.
대안 지정
"|" 문자는 두 개 이상의 대안이 일치를 나타내도록 지정합니다. 예를 들어 VBScript 정규식 "(Chapter|Section) [1-9]"는 "Chapter 1", "Chapter 9" 및 "Section 2"와 일치합니다. 자세한 내용은 대체 및 하위 표현식에서 설명합니다.
부분 일치 사용
정규 표현식의 괄호는 하위 표현식을 만드는 데 사용됩니다. 결과 부분 일치는 프로그램에서 검색할 수 있습니다. 자세한 내용은 대체 및 하위 표현식에서 설명합니다.
정규 표현식과 교체 문자열 내에서 하위 표현식을 참조할 수 있습니다. 자세한 내용은 역참조에서 설명합니다.
정규 표현식 프로그래밍
VBScript(Visual Basic Scripting Edition)에서 정규식을 사용하여 문자열에서 패턴을 검색하고, 텍스트를 바꾸고, 하위 문자열을 추출할 수 있습니다.
VBScript에서 검색
다음 VBScript 예제는 단어의 모든 항목을 찾습니다.
"\w+" 정규식 패턴은 AZ, az, 0-9 및 밑줄 문자 중 하나 이상과 일치하도록 지정합니다.
Global 속성을 True 로 설정하면 검색 시 첫 번째 패턴이 아닌 패턴의 모든 항목을 찾도록 지정됩니다.
Execute 메서드는 검색 결과가 포함된 Matches 컬렉션을 반환합니다 . 프로그램은 Matches 컬렉션을 반복하여 각 일치 항목을 검색합니다.
Sub SearchGlobal
Dim src, ptrn, re, Match, Matches
src = "The quick brown fox jumps over the lazy dog"
ptrn = "\w+"
' Create the regular expression.
Set re = New RegExp
re.Pattern = ptrn
re.IgnoreCase = False
re.Global = True
' Perform the search.
Set Matches = re.Execute(src)
' Iterate through the Matches collection.
For Each Match in Matches
' New line.
document.write ("<br />")
document.write (Match.FirstIndex & " ")
document.write (Match.Value)
Next
' Output:
' 0 The
' 4 quick
' 10 brown
' 16 fox
' 20 jumps
' 26 over
' 31 the
' 35 lazy
' 40 dog
End Sub
VBA로 바꾸면 다음과 같습니다.
Sub SearchGlobal()
Dim src As String, ptrn As String
Dim re As Object, Match As Object, Matches As Object
src = "The quick brown fox jumps over the lazy dog"
ptrn = "\w+"
' Create the regular expression.
Set re = CreateObject("VBScript.RegExp")
re.Pattern = ptrn
re.IgnoreCase = False
re.Global = True
' Perform the search.
Set Matches = re.Execute(src)
' Iterate through the Matches collection.
For Each Match In Matches
' New line.
Debug.Print vbCrLf
Debug.Print Match.FirstIndex & " ";
Debug.Print Match.Value
Next Match
' Output:
' 0 The
' 4 quick
' 10 brown
' 16 fox
' 20 jumps
' 26 over
' 31 the
' 35 lazy
' 40 dog
End Sub
다음 VBScript 예제는 단일 일치 항목을 찾습니다.
Sub SearchNonGlobal
Dim src, ptrn, re, Match, Matches
src = "The quick brown fox jumps over the lazy dog"
ptrn = "\w+"
' Create the regular expression.
Set re = New RegExp
re.Pattern = ptrn
re.IgnoreCase = False
re.Global = False
' Perform the search.
Set Matches = re.Execute(src)
If Matches.Count = 0 Then
document.write ("Not Found")
Else
' New line.
document.write ("<br />")
document.write (Matches(0).FirstIndex & " ")
document.write (Matches(0).Value)
End If
' Output:
' 0 The
End Sub
VBA로 바꾸면 다음과 같습니다.
Sub SearchNonGlobal()
Dim src As String, ptrn As String
Dim re As Object, Match As Object, Matches As Object
src = "The quick brown fox jumps over the lazy dog"
ptrn = "\w+"
' Create the regular expression.
Set re = CreateObject("VBScript.RegExp")
re.Pattern = ptrn
re.IgnoreCase = False
re.Global = False
' Perform the search.
Set Matches = re.Execute(src)
If Matches.Count = 0 Then
MsgBox "Not Found"
Else
' New line.
Debug.Print vbCrLf
Debug.Print Matches(0).FirstIndex & " ";
Debug.Print Matches(0).Value
End If
' Output:
' 0 The
End Sub
텍스트 바꾸기
다음 예에서 "the"는 "a"로 대체됩니다. IgnoreCase = False이므로 "The"의 인스턴스는 대체되지 않습니다.
VBScript 예제에서는 Replace 메서드를 사용합니다.
Sub ReplaceGlobal
Dim src, ptrn, re, Result
src = "The batter hit the ball with the bat "
src = src & "and the fielder caught the ball with the glove."
ptrn = "the"
' Create the regular expression.
Set re = New RegExp
re.Pattern = ptrn
re.IgnoreCase = False
re.Global = True
' Replace "the" with "a".
Result = re.Replace(src, "a")
document.write(Result)
' Output:
' The batter hit a ball with a bat and a fielder caught a ball with a glove.
End Sub
VBA로 바꾸면 다음과 같습니다.
Sub ReplaceGlobal()
Dim src As String, ptrn As String, re As Object, Result As String
src = "The batter hit the ball with the bat "
src = src & "and the fielder caught the ball with the glove."
ptrn = "the"
' Create the regular expression.
Set re = CreateObject("VBScript.RegExp")
re.Pattern = ptrn
re.IgnoreCase = False
re.Global = True
' Replace "the" with "a".
Result = re.Replace(src, "a")
Debug.Print Result
' Output:
' The batter hit a ball with a bat and a fielder caught a ball with a glove.
End Sub
하위 문자열 추출
정규식 패턴에 괄호를 넣으면 나중에 사용하기 위해 저장할 수 있는 부분 일치가 생성됩니다.
다음 예에서 패턴에는 3개의 하위 일치가 포함됩니다. 하위 일치 문자열은 각 일치 항목과 함께 표시됩니다.
이 VBScript 예제에서 하위 일치는 각 Match Object의 SubMatches Collection에 포함되어 있습니다.
Function SearchWithSubmatches()
Dim src, ptrn, re, Match, Matches, NewLine, s
src = "Please send mail to george@contoso.com and someone@example.com. Thanks!"
' Set the pattern to search for an e-mail address.
' (More sophisticated RegExp patterns are available for
' matching an email address).
ptrn = "(\w+)@(\w+)\.(\w+)"
' Create the regular expression.
Set re = New RegExp
re.Pattern = ptrn
re.Global = True
' Get the Matches collection
Set Matches = re.Execute(src)
' Create the output string.
NewLine = "<br />"
s = ""
For Each Match in Matches
s = s & NewLine
' The Match object contains the entire match.
s = s & "e-mail address: " & Match.Value
' Get the submatched parts of the address.
s = s & NewLine
s = s & "user name: " & Match.SubMatches(0)
s = s & NewLine
s = s & "host name: " & Match.SubMatches(1)
s = s & NewLine
s = s & "top-level domain: " & Match.SubMatches(2)
s = s & NewLine
Next
document.write (s)
' Output:
' e-mail address: george@contoso.com
' user name: george
' host name: contoso
' top-level domain: com
' e-mail address: someone@example.com
' user name: someone
' host name: example
' top-level domain: com
End Function
VBA로 바꾸면 다음과 같습니다.
Function GetEmailAddresses(ByVal src As String) As String
Dim ptrn As String
Dim re As Object, Match As Object, Matches As Object
Dim NewLine As String, s As String
ptrn = "(\w+)@(\w+)\.(\w+)"
' Create the regular expression.
Set re = CreateObject("VBScript.RegExp")
re.Pattern = ptrn
re.Global = True
' Get the Matches collection
Set Matches = re.Execute(src)
' Create the output string.
NewLine = vbCrLf
s = ""
For Each Match In Matches
s = s & NewLine
' The Match object contains the entire match.
s = s & "e-mail address: " & Match.Value
' Get the submatched parts of the address.
s = s & NewLine
s = s & "user name: " & Match.SubMatches(0)
s = s & NewLine
s = s & "host name: " & Match.SubMatches(1)
s = s & NewLine
s = s & "top-level domain: " & Match.SubMatches(2)
s = s & NewLine
Next Match
GetEmailAddresses = s
End Function
정규 표현식 구문
정규식은 텍스트 본문을 검색할 때 일치시킬 하나 이상의 문자열을 설명합니다. 표현식은 검색 중인 문자열에 문자 패턴을 일치시키기 위한 템플릿 역할을 합니다.
정규식은 일반 문자(예: a에서 z까지의 문자)와 메타 문자 로 알려진 특수 문자로 구성됩니다 .
특수 문자
다음 표에는 단일 문자 메타 문자 목록과 정규식에서의 해당 동작이 포함되어 있습니다.
메모
이러한 특수 문자 중 하나를 일치시키려면 먼저 문자를 이스케이프 해야 합니다 . 즉, 문자 앞에 백슬래시 문자(\)를 추가해야 합니다. 예를 들어 "+" 리터럴 문자를 검색하려면 "\+" 식을 사용할 수 있습니다.
대부분의 특수 문자는 대괄호 표현식 안에 포함될 경우 의미를 잃고 일반 문자로 표시됩니다. 자세한 내용은 일치하는 문자 목록의 "대괄호 표현식의 문자"에서 설명합니다.
메타문자
다음 표에는 여러 문자 메타 문자 목록과 정규식에서의 해당 동작이 포함되어 있습니다.
인쇄되지 않는 문자
다음 표에는 인쇄되지 않는 문자를 나타내는 이스케이프 시퀀스가 포함되어 있습니다.
우선 순위
정규 표현식은 산술 표현식과 매우 유사하게 평가됩니다. 즉, 왼쪽에서 오른쪽으로 평가되며 우선 순위를 따릅니다.
다음 표에는 정규식 연산자의 우선 순위가 높은 것부터 낮은 것까지 나와 있습니다.
문자는 대체 연산자보다 우선 순위가 높으므로 "m|food"는 "m" 또는 "food"와 일치할 수 있습니다.
일치하는 문자 목록
하나 이상의 개별 문자를 괄호[ ]로 묶어 일치하는 문자 목록을 만들 수 있습니다. 문자를 대괄호로 묶는 경우 이 목록을 대괄호 표현식이라고 합니다.
대괄호 표현식으로 묶인 문자는 대괄호 표현식이 나타나는 정규식의 위치에 대해 단일 문자만 일치합니다. 다음 VBScript 정규식은 "1장", "2장", "3장", "4장" 및 "5장"과 일치합니다.
"Chapter [12345]"
대괄호 표현식은 Chapter라는 단어와 공백 바로 뒤에 있는 단일 문자 위치와 일치하는 문자 집합만 지정하는 데 사용됩니다. 즉, 아홉 번째 문자 위치입니다.
대괄호 표현식의 문자
괄호 안에는 다른 곳과 마찬가지로 일반 문자가 자신을 나타냅니다. 즉, 검색된 텍스트에서 자신의 발생과 일치합니다. 대부분의 특수 문자는 대괄호 표현식 안에 있으면 의미를 잃습니다. 다음은 몇 가지 예외입니다.
닫는 괄호 문자(])는 목록이 첫 번째 항목이 아닌 경우 목록을 끝냅니다. 목록에서 닫는 대괄호 문자를 일치시키려면 여는 대괄호([) 바로 뒤에 먼저 포함하십시오.
백슬래시 문자(\)는 계속 이스케이프 문자입니다. 백슬래시 문자를 일치시키려면 두 개의 백슬래시(\\)를 사용하십시오.
문자 범위에 하이픈 사용
문자 자체가 아닌 범위를 사용하여 일치하는 문자를 표현하려면 하이픈(-) 문자를 사용하여 범위의 시작 문자와 끝 문자를 구분할 수 있습니다. 다음 VBScript 정규식은 "Chapter [12345]"와 같습니다.
"Chapter [1-5]"
시작 값과 종료 값이 모두 범위에 포함됩니다. 시작 값은 유니코드 정렬 순서에서 끝 값보다 선행해야 합니다. 개별 문자의 문자 값은 범위에서 상대적인 순서를 결정합니다.
대괄호 표현식의 일반적인 용도는 대문자 또는 소문자 알파벳 문자나 숫자의 일치 항목을 지정하는 것입니다.
다음 VBScript 식은 이러한 일치를 지정합니다.
"[A-Za-z0-9]"
식에 하이픈 문자 포함
대괄호 표현식에 하이픈 문자를 포함하려면 다음 방법 중 하나를 사용할 수 있습니다.
다음 식과 같이 백슬래시 이스케이프 문자를 앞에 놓으십시오.
[\-]
대괄호로 묶인 목록의 시작 또는 끝에 하이픈 문자를 넣습니다. 다음 표현식은 모든 소문자와 하이픈을 일치시킵니다.
[-a-z]
[a-z-]
부정을 나타내는 캐럿의 사용
목록 시작 부분에 캐럿(^) 문자를 포함하여 목록이나 범위에 없는 모든 문자를 찾을 수도 있습니다. 캐럿 문자가 목록의 다른 위치에 나타나면 자신과 일치합니다. 즉, 특별한 의미가 없습니다. 다음 VBScript 정규식은 1에서 5까지의 문자를 포함하지 않는 Chapter 머리글과 일치합니다.
"Chapter [^12345]"
이전 예에서 표현식은 1, 2, 3, 4 또는 5를 제외한 9번째 위치의 모든 문자와 일치합니다. 따라서 예를 들어 "Chapter 7"은 일치 항목이고 "Chapter 9"도 일치 항목입니다.
하이픈 문자(-)를 사용하여 동일한 표현식을 나타낼 수 있습니다. VBScript의 경우 다음 식을 사용합니다.
"Chapter [^1-5]"
모든 문자 일치
마침표(.)는 개행 문자(\n)를 제외하고 문자열의 인쇄 또는 인쇄되지 않는 단일 문자와 일치합니다. VBScript의 "ac"는 "aac", "abc", "acc", "adc", "a1c", "a2c", "ac" 및 "a#c"와 일치합니다.
검색된 문자열에 포함된 마침표(.)를 일치시키려면 정규식에서 마침표 앞에 백슬래시(\)를 추가할 수 있습니다.
VBScript의 "filename\.ext"는 "filename.ext"와 일치합니다.
수량자
때로는 얼마나 많은 문자가 일치해야 하는지 알 수 없습니다. 이러한 종류의 불확실성을 수용하기 위해 정규 표현식은 한정 기호의 개념을 지원합니다. 이러한 수량자를 사용하면 일치 항목이 참이 되기 위해 정규식의 지정된 구성 요소가 발생해야 하는 횟수를 지정할 수 있습니다.
아래 표에서는 다양한 한정 기호 및 그 의미를 설명합니다.
입력 문서가 큰 경우 장 번호는 9를 넘기 쉬우므로 두 자리 또는 세 자리 수의 장 번호를 처리할 수 있는 방법이 필요합니다. 한정 기호는 이러한 기능을 제공합니다. 다음 VBScript 정규식은 모든 자리 수의 장 제목을 찾습니다.
"Chapter [1-9][0-9]*"
한정 기호는 범위식 다음에 나타납니다. 그러므로 이 경우 한정 기호는 0과 9를 포함한 자리 수를 지정하는 전체 범위식에 적용됩니다.
'+' 한정 기호는 두 번째 위치 또는 그 다음에 꼭 숫자가 올 필요가 없으므로 여기서 사용되지 않습니다. '?' 문자도 장 번호를 두 자리 수로 제한하므로 사용되지 않습니다. 'Chapter'와 공백 문자 다음에 한 자리 수 이상을 찾을 수도 있습니다.
장 번호는 99장으로만 제한되므로 다음 VBScript 식을 사용하여 적어도 한 자리 수를 지정할 수 있지만 두 자리 수 이상은 지정할 수 없습니다.
"Chapter [0-9]{1,2}"
위 식의 단점은 99보다 큰 장 번호가 있어도 처음 두 자리 수에 해당하는 장 번호만을 찾는다는 것입니다. 또한 누군가가 Chapter 0을 만들어도 그것까지 찾습니다. 두 자리 수만을 찾는 VBScript 식은 아래 예를 사용하는 것이 좋습니다.
"Chapter [1-9][0-9]?"
또는 다음과 같습니다.
"Chapter [1-9][0-9]{0,1}"
'*', '+' 및 '?' 한정 기호는 모두 무제한적이라고 하며 가능한 한 텍스트를 많이 찾습니다. 그러나 이렇게 많이 찾을 필요가 없는 경우도 있습니다. 즉, 최소한으로 찾아야 하는 경우도 있습니다.
예를 들어, HTML 문서에 다음과 같은 텍스트가 있고, H1 태그로 묶인 장 제목을 찾는다고 가정합니다.
<H1>Chapter 1 – Introduction to Regular Expressions</H1>
다음 식은 여는 H1 태그에 있는 보다 작음 기호(<)에서 닫는 H1 태그 끝에 있는 보다 큼 기호(>) 사이에 있는 모든 문자열을 찾습니다.
"<.*>"
실제 검색하려는 문자열이 여는 H1 태그뿐인 경우에 다음 제한적인 식은 <H1>만 찾습니다.
"<.*?>"
'?'를 '*', '+' 또는 '?' 한정 기호 다음에 놓으면 식은 무제한적인 검색에서 제한적인 검색 또는 최소 검색으로 변환됩니다.
앵커
앵커를 사용하면 정규식을 라인의 시작 또는 끝으로 고정할 수 있습니다. 또한 단어 내에서 또는 단어의 처음이나 끝에 나타나는 정규식을 만들 수 있습니다.
지금까지 예는 장 제목이 나타나는 위치를 찾는 작업에 관한 것이었습니다. 공백, 숫자가 이어지는 'Chapter' 문자열의 위치는 실제 장 제목이거나 다른 장에 대한 상호 참조일 수 있습니다. 실제로 장 제목은 항상 줄의 시작 위치에 있으므로 제목만 찾고 상호 참조는 찾지 않는 방법을 만들 수 있습니다.
앵커가 이러한 기능을 제공합니다. 앵커를 사용하면 정규식을 줄의 시작이나 끝으로 고정시킬 수 있습니다. 단어 내부 또는 단어 시작이나 끝에 나타나는 정규식을 만들 수도 있습니다. 다음 표는 정규식 앵커 및 그 의미를 보여줍니다.
앵커와 한정 기호는 함께 사용할 수 없습니다. 줄 바꿈 또는 단어 경계 전후 바로 다음에는 한 자리만 올 수 있으므로 '^*'와 같은 식은 허용되지 않습니다.
텍스트 줄의 시작 위치에 있는 텍스트를 찾으려면 정규식 시작에 '^' 문자를 사용합니다. 이것은 대괄호 식에서 사용하는 '^'와는 다릅니다.
텍스트 줄 끝에 있는 텍스트를 찾으려면 정규식 끝에 '$' 문자를 사용하십시오.
장 제목을 찾을 때 다음 VBScript 정규식에서처럼 앵커를 사용할 수 있습니다. 그러면 줄의 시작 위치에서 두 자리까지 장 제목을 찾습니다.
"^Chapter [1-9][0-9]{0,1}"
실제로 장 제목이 있는 줄에는 장 제목만 있으므로 장 제목은 줄의 시작 및 끝에 있어야 합니다. 다음 식에서 지정된 검색 문자열은 장만 찾고 상호 참조는 찾지 않습니다. 따라서 이 정규식은 텍스트 줄의 시작과 끝에서만 찾습니다.
"^Chapter [1-9][0-9]{0,1}$"
단어 경계를 찾는 방법은 약간 다르지만 정규식에 매우 중요한 기능을 추가합니다. 단어 경계는 단어와 공백 사이의 위치입니다. 비단어 경계는 그외 다른 위치입니다. 다음 VBScript 식은 단어 'Chapter'의 처음 세 문자가 단어 경계 다음에 나타나므로 이 세 문자를 찾습니다.
"\bCha"
여기서 '\b' 연산자의 위치는 매우 중요합니다. 이 연산자가 검색할 문자열 앞에 올 경우 단어의 시작 부분에서 문자열을 찾고 검색할 문자열 뒤에 올 경우에는 단어의 끝 부분에서 문자열을 찾습니다. 예를 들어, 다음 식은 'ter'가 단어 경계 앞에 오므로 'Chapter'라는 단어에서 'ter'를 찾습니다.
"ter\b"
다음 식은 'Chapter'의 'apt'를 찾지만 'aptitude'의 'apt는 찾지 않습니다.
또는 다음과 같습니다.
"\Bapt"
왜냐하면 'apt'는 'Chapter'라는 단어에서 비단어 경계에 있지만 'aptitude'라는 단어에서는 단어 경계에 있기 때문입니다. 비단어 경계 연산자의 경우 검색할 문자열이 단어 시작이나 끝과 관계가 없으므로 위치는 중요하지 않습니다.
대체 및 하위 표현식
파이프(|) 문자를 사용하여 둘 이상의 대안 중에서 선택 사항을 지정할 수 있습니다. 이것을 교체 라고 합니다 . 파이프 문자의 양쪽에서 가능한 가장 큰 표현식이 일치합니다. VBScript(Visual Basic Scripting Edition)에 대한 다음 식은 "Chapter" 또는 "Section" 다음에 한두 자리 숫자가 오는 것과 일치한다고 생각할 수 있습니다.
"^Chapter|Section [1-9][0-9]{0,1}$"
대신 정규식은 "Chapter" 또는 "Section"이라는 단어와 그 뒤의 모든 숫자와 일치합니다. 검색된 문자열이 "섹션 22"인 경우 표현식은 "섹션 22"와 일치합니다. 그러나 검색된 문자열이 "Chapter 22"인 경우 식은 "Chapter 22"가 아니라 "Chapter"라는 단어와 일치합니다.
괄호를 사용하여 대체 범위를 제한할 수 있습니다. 즉, "Chapter"와 "Section"이라는 두 단어에만 적용되도록 할 수 있습니다. 괄호를 추가하면 정규 표현식이 "Chapter 1" 또는 "Section 3"과 일치하도록 만들 수 있습니다.
그러나 괄호는 하위 표현식을 만드는 데에도 사용됩니다. 결과 부분 일치는 프로그램에서 검색할 수 있습니다.
다음 VBScript 정규식은 괄호를 사용하여 "Chapter" 및 "Section"을 그룹화합니다. 가능한 일치 항목에는 "챕터"와 숫자가 포함됩니다.
"^(Chapter|Section) [1-9][0-9]{0,1}"
"Chapter|Section" 주변의 괄호는 일치하는 두 단어 중 하나가 나중에 사용할 수 있도록 저장되도록 합니다.
다음 예제는 코드에서 일치 및 부분 일치를 검색하는 방법을 보여줍니다. 표현식에 하나의 괄호 세트만 있기 때문에 하나의 저장된 부분 일치만 있습니다.
Sub TestShowMatches()
Dim src As String, ptrn As String
ptrn = "(Chapter|Section) [1-9][0-9]{0,1}"
src = "Chapter 50 Section 85"
ShowMatches src, ptrn
End Sub
Sub ShowMatches(src As String, ptrn As String)
Dim re As Object, Match As Object, Matches As Object
Dim NewLine As String, Index As Integer, s As String
NewLine = vbCrLf
' Create the regular expression.
Set re = CreateObject("VBScript.RegExp")
re.Pattern = ptrn
re.Global = True
re.IgnoreCase = True
' Get the Matches collection.
Set Matches = re.Execute(src)
s = ""
For Each Match In Matches
' Show the entire match.
s = s & NewLine & Match.Value & NewLine
' Show the submatches.
For Index = 0 To Match.SubMatches.Count - 1
s = s & "submatch " & Index & ": "
s = s & Match.SubMatches(Index)
s = s & NewLine
Next
Next
MsgBox s
End Sub
' Output:
' Chapter 50
' submatch 0: Chapter
' Section 85
' submatch 0: Section
이전 예에서는 괄호를 사용하여 "Chapter"와 "Section"이라는 단어 사이에서 선택 항목을 그룹화 했습니다.
나중에 사용하기 위해 하위 일치가 저장되지 않도록 하려면 하위 표현식(?: pattern )을 지정할 수 있습니다. 다음 예제는 이전 예제와 동일한 작업을 수행하지만 부분 일치를 저장하지 않습니다.
Sub TestShowMatches()
Dim src As String, ptrn As String
ptrn = "(?:Chapter|Section) [1-9][0-9]{0,1}"
src = "Chapter 50 Section 85"
ShowMatches src, ptrn
End Sub
Sub ShowMatches(src As String, ptrn As String)
Dim re As Object, Match As Object, Matches As Object
Dim Index As Integer, s As String
' Create the regular expression.
Set re = CreateObject("VBScript.RegExp")
re.Pattern = ptrn
re.Global = True
re.IgnoreCase = True
' Get the Matches collection.
Set Matches = re.Execute(src)
s = ""
For Each Match In Matches
' Show the entire match.
s = s & Match.Value & vbCrLf
Next
MsgBox s
End Sub
' Output
' Chapter 50
' Section 85
정규표현식에 괄호를 넣으면 부분 표현식(Subexpression)이 생성됩니다. 이로써 생성된 하위 일치(submatch)는 프로그램에서 검색하여 사용할 수 있습니다.
다음 예제에서 정규표현식은 세 개의 부분 표현식을 포함하고 있습니다. 하위 일치 문자열은 각 일치와 함께 표시됩니다.
Sub TestShowMatches()
Dim src As String, ptrn As String
ptrn = "(\w+)@(\w+)\.(\w+)"
src = "Please send mail to george@contoso.com and someone@example.com. Thanks!"
ShowMatches src, ptrn
End Sub
Sub ShowMatches(src As String, ptrn As String)
Dim re As Object, Match As Object, Matches As Object
Dim Index As Integer, s As String
' Create the regular expression.
Set re = CreateObject("VBScript.RegExp")
re.Pattern = ptrn
re.Global = True
re.IgnoreCase = True
' Get the Matches collection.
Set Matches = re.Execute(src)
s = ""
For Each Match In Matches
' Show the entire match.
s = s & Match.Value & vbCrLf
' Show the submatches.
For Index = 0 To Match.SubMatches.Count - 1
s = s & "submatch " & Index & ": "
s = s & Match.SubMatches(Index) & vbCrLf
Next
Next
MsgBox s
End Sub
' Output:
' george@contoso.com
' submatch 0: george
' submatch 1: contoso
' submatch 2: com
' someone@example.com
' submatch 0: someone
' submatch 1: example
' submatch 2: com
다음 예에서는 URI(Universal Resource Indicator)를 구성 요소 부분으로 분리합니다.
첫 번째 괄호 하위 표현식은 웹 주소의 프로토콜 부분을 저장합니다. 콜론과 두 개의 슬래시 앞에 오는 모든 단어와 일치합니다. 두 번째 괄호 하위 표현식은 주소의 도메인 주소 부분을 저장합니다. 슬래시 기호(/) 또는 콜론(:) 문자를 포함하지 않는 모든 문자 시퀀스와 일치합니다. 세 번째 괄호 하위 표현식은 웹 사이트 포트 번호(지정된 경우)를 저장합니다. 콜론 뒤에 오는 0개 이상의 숫자와 일치합니다. 네 번째 괄호 하위 표현식은 웹 주소로 지정된 경로 및/또는 페이지 정보를 저장합니다. 숫자 기호 문자(#) 또는 공백 문자 이외의 0개 이상의 문자와 일치합니다.
Sub TestShowMatches()
Dim src As String, ptrn As String
ptrn = "(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)"
src = "https://msdn.microsoft.com:80/scripting/default.htm"
ShowMatches src, ptrn
End Sub
Sub ShowMatches(src As String, ptrn As String)
Dim re As Object, Match As Object, Matches As Object
Dim Index As Integer, s As String
' Create the regular expression.
Set re = CreateObject("VBScript.RegExp")
re.Pattern = ptrn
re.Global = True
re.IgnoreCase = True
' Get the Matches collection.
Set Matches = re.Execute(src)
s = ""
For Each Match In Matches
' Show the entire match.
s = s & Match.Value & vbCrLf
' Show the submatches.
For Index = 0 To Match.SubMatches.Count - 1
s = s & "submatch " & Index & ": "
s = s & Match.SubMatches(Index) & vbCrLf
Next
Next
Debug.Print s
End Sub
' Output:
' https://msdn.microsoft.com:80/scripting/default.htm
' submatch 0: https
' submatch 1: msdn.microsoft.com
' submatch 2: :80
' submatch 3: /scripting/default.htm
긍정 및 부정 전방탐색
긍정 전방탐색은 일치가 발견된 후, 다음 일치를 찾기 시작할 때, 일치된 텍스트 앞에서 탐색하는 것입니다. 일치는 나중에 사용하기 위해 저장되지 않습니다. 긍정 전방탐색을 지정하려면 (?=pattern) 구문을 사용합니다.
다음 예에서는 비밀번호가 4에서 8자로 이루어져 있으며 적어도 하나의 숫자를 포함하는지 여부를 판별하는 검색이 수행됩니다.
정규표현식 내에서 .*\d는 어떤 수의 문자가 숫자에 의해 뒤따르는 것을 찾습니다. "abc3qr"이라는 검색 대상 문자열에 대해서 이는 "abc3"과 일치합니다. 이 일치의 위치 앞에서 .{4,8}는 4에서 8자의 문자열과 일치합니다. 이는 "abc3qr"에 일치합니다.
^와 $는 검색 대상 문자열의 시작과 끝을 나타냅니다. 이는 검색 대상 문자열에 일치되는 문자 외에 다른 문자가 포함되어 있을 경우 일치하지 않도록 하기 위한 것입니다.
Sub TestShowMatches()
Dim src As String, ptrn As String
ptrn = "^(?=.*\d).{4,8}$"
src = "abc3qr"
ShowMatches src, ptrn
End Sub
Sub ShowMatches(src As String, ptrn As String)
Dim re As Object, Match As Object, Matches As Object
Dim s As String
' Create the regular expression.
Set re = CreateObject("VBScript.RegExp")
re.Pattern = ptrn
' Test if the input matches the pattern.
If re.Test(src) Then
MsgBox src
End If
End Sub
' Output:
' abc3qr
부정 전방탐색은 부정 전방탐색 식에 있는 패턴과 일치하지 않는 검색 문자열을 찾습니다. 일치가 발견된 후, 다음 일치를 찾기 시작할 때, 일치된 텍스트 앞에서 탐색합니다. 일치는 나중에 사용하기 위해 저장되지 않습니다. 부정 전방탐색을 지정하려면 (?!pattern) 구문을 사용합니다.
다음 예에서는 "th"로 시작하지 않는 단어를 찾습니다.
정규표현식 내에서 \b는 단어 경계에 일치합니다. 검색 대상 문자열 " quick "에 대해서 이는 첫 번째 공백과 일치합니다. (?!th)는 "th"가 아닌 문자열과 일치합니다. 이는 "qu"에 일치합니다. 그리고 그 일치 위치 앞에서 \w+는 단어와 일치합니다. 이는 "quick"에 일치합니다.
Sub TestShowMatches()
Dim src As String, ptrn As String
ptrn = "\b(?!th)\w+\b"
src = "The quick brown fox jumps over the lazy dog."
ShowMatches src, ptrn
End Sub
Sub ShowMatches(src As String, ptrn As String)
Dim re As Object, Match As Object, Matches As Object
Dim Index As Integer, s As String
' Create the regular expression.
Set re = CreateObject("VBScript.RegExp")
re.Pattern = ptrn
re.Global = True
' Get the Matches collection.
Set Matches = re.Execute(src)
s = ""
For Each Match In Matches
' Show the entire match.
s = s & Match.Value & vbCrLf
Next
MsgBox s
End Sub
' Output:
' The
' quick
' brown
' fox
' jumps
' over
' lazy
' dog
역참조
역참조는 반복되는 문자 그룹을 찾는 데 사용됩니다. 또한 입력 문자열에서 요소의 순서와 배치를 재정렬하여 입력 문자열의 형식을 다시 지정하는 데 사용됩니다.
정규 표현식과 교체 문자열 내에서 하위 표현식을 참조할 수 있습니다. 각 하위 표현식은 숫자로 식별되며 역참조라고 합니다.
정규 표현식의 괄호는 하위 표현식을 만드는 데 사용됩니다. 결과 부분 일치는 프로그램에서 검색할 수 있습니다.
저장된 하위 일치
정규 표현식 내에서 하위 표현식을 참조할 수 있습니다.
정규식에서 저장된 각 하위 일치 항목은 왼쪽에서 오른쪽으로 발생하는 대로 저장됩니다. 부분 일치가 저장되는 버퍼 번호는 1부터 시작하여 최대 99개의 부분 표현식까지 계속됩니다. 정규식 내에서 \ n 을 사용하여 각 버퍼에 액세스할 수 있습니다 . 여기서 n 은 특정 버퍼를 식별하는 1자리 또는 2자리 10진수입니다.
역참조를 적용하면 텍스트에서 두 개의 동일한 단어가 함께 나오는 위치를 찾을 수 있습니다.
다음 문장을 보십시오. "Is is the cost of of gasoline going up up?"
이 문장에는 중복된 단어가 여러 개 포함되어 있습니다. 모든 단어의 중복을 찾을 필요 없이 문장을 고정하는 방법을 고안하는 것이 유용할 것입니다. 다음 VBScript 정규식은 단일 하위 식을 사용하여 이를 수행합니다.
"\b([a-z]+) \1\b"
이 경우 하위 표현식은 괄호로 묶인 모든 것입니다. 해당 하위 표현식에는 [az]+로 지정된 하나 이상의 알파벳 문자가 포함됩니다. 정규식의 두 번째 부분은 이전에 저장된 부분 일치에 대한 참조, 즉 방금 괄호 표현식과 일치한 단어의 두 번째 항목입니다. \1은 첫 번째 부분 일치를 지정하는 데 사용됩니다.
\b 단어 경계 메타 문자는 별도의 단어만 감지되도록 합니다. 그렇지 않으면 "is issue" 또는 "this is"와 같은 문구가 이 표현으로 잘못 식별됩니다.
다음 예는 중복된 단어를 나열합니다. 코드에서 일치 항목과 부분 일치 항목을 검색하는 방법을 보여줍니다.
Sub TestShowMatches()
Dim src As String, ptrn As String, s As String
ptrn = "\b([a-z]+) \1\b"
src = "Is is the cost of of gasoline going up up?"
s = GetMatchesOutput(src, ptrn)
MsgBox s
End Sub
Function GetMatchesOutput(src As String, ptrn As String) As String
Dim re As Object, Match As Object, Matches As Object
Dim NewLine As String, Index As Integer, s As String
NewLine = vbCrLf
' Create the regular expression.
Set re = CreateObject("VBScript.RegExp")
re.Pattern = ptrn
re.Global = True
re.IgnoreCase = True
' Get the Matches collection.
Set Matches = re.Execute(src)
s = ""
For Each Match In Matches
' Show the entire match.
s = s & NewLine & Match.Value & NewLine
' Show the submatches.
For Index = 0 To Match.SubMatches.Count - 1
s = s & "submatch " & Index & ": "
s = s & Match.SubMatches(Index) & NewLine
Next
Next
GetMatchesOutput = s
End Function
' Output:
' Is is
' submatch 0: Is
' of of
' submatch 0: of
' up up
' submatch 0: up
대체 문자열 내에서 하위 표현식을 참조할 수도 있습니다.
위에 표시된 정규식을 사용하여 다음 예제에서는 두 개의 연속된 동일한 단어를 동일한 단어의 단일 항목으로 바꿉니다. replace 메서드 에서 $1은 처음 저장된 부분 일치를 나타냅니다. 하위 일치 항목이 두 개 이상인 경우 연속적으로 $2, $3 등으로 참조합니다.
Sub TestReplaceMatches()
Dim src As String, ptrn As String, result As String
ptrn = "\b([a-z]+) \1\b"
src = "Is is the cost of of gasoline going up up?"
result = ReplaceMatches(src, ptrn)
MsgBox result
End Sub
Function ReplaceMatches(src As String, ptrn As String) As String
Dim re As Object
Dim result As String
' Create the regular expression.
Set re = CreateObject("VBScript.RegExp")
re.Pattern = ptrn
re.Global = True
re.IgnoreCase = True
' Replace matches in the source string.
result = re.Replace(src, "$1")
ReplaceMatches = result
End Function
' Output
' Is the cost of gasoline going up?
다음 예제에서는 문자열의 각 단어 쌍을 교환합니다.
Sub TestReplaceMatches()
Dim src As String, ptrn As String, result As String
ptrn = "(\S+)(\s+)(\S+)"
src = "The quick brown fox jumps over the lazy dog."
result = ReplaceMatches(src, ptrn)
MsgBox result
End Sub
Function ReplaceMatches(src As String, ptrn As String) As String
Dim re As Object
Dim result As String
' Create the regular expression.
Set re = CreateObject("VBScript.RegExp")
re.Pattern = ptrn
re.Global = True
re.IgnoreCase = True
' Replace matches in the source string.
result = re.Replace(src, "$3$2$1")
ReplaceMatches = result
End Function
' Output:
' quick The fox brown over jumps lazy the dog.
도움말 출처
Introduction to Regular Expressions (Scripting)
Table of contents Introduction to Regular Expressions (Scripting) Article 07/17/2015 In this article --> These topics introduce the concept of regular expressions and explain how to create and use them. A regular expression describes one or more strings to
learn.microsoft.com
'Regular Expressions(정규표현식)' 카테고리의 다른 글
SubMatches 컬렉션 (0) | 2023.08.21 |
---|---|
Matches 컬렉션 (0) | 2023.08.21 |
Match 개체 (0) | 2023.08.20 |
RegExp 개체 (0) | 2023.08.20 |