RegExMatch() [v1.0.45+]
문자열에 패턴이 담겨 있는지 알아냅니다 (정규 표현식).
FoundPos := RegExMatch(Haystack, NeedleRegEx [, UnquotedOutputVar = "", StartingPosition = 1])
매개변수
역주 : 정규표현식으로 목표 문자열에서 패턴을 찾는 것을
건초더미(Haystack)에서 바늘(NeedleRegEx)을 찾는 것에비유함.
- FoundPos
RegExMatch()는 문자열 Haystack에 NeedleRegEx가 나타난 가장 왼쪽의 위치를 돌려줍니다. 위치가 1이면 첫 번째 문자입니다. 패턴이 발견되지 않으면 0을 돌려줍니다. 에러가 일어나면 (NeedleRegEx 안에서 구문 에러가 일어나면), 빈 문자열이 반환됩니다. ErrorLevel은 0 대신에 아래의 값 중 하나가 사용됩니다.
- Haystack
내용을 검색할 문자열.
- NeedleRegEx
검색 할 패턴, 펄-호환의 정규 표현식입니다 (PCRE). 패턴의 옵션은 문자열 처음에 포함해야 하고 그 다음에 닫는 반괄호가 따라 옵니다. 예를 들어, 패턴 "i)abc.*123"는 대소문자 비구분 옵션을 켜고 "abc"를 검색 한 다음, 0개 이상의 문자를 검색하고, 다음에 "123"을 검색합니다. 옵션이 없다면, ")"는 선택적입니다; 예를 들어, ")abc"는 "abc"와 동등합니다.
- UnquotedOutputVar
Mode 1 (기본값): OutputVar는 한 따옴표를 제거한 변수입니다. 그 안에다 전체 패턴에 부합한 Haystack 부분을 저장합니다. 패턴이 발견되지 않으면 (즉, 함수가 0을 돌려주면), 이 변수와 모든 배열 원소는 비워집니다.
나포 부패턴이 NeedleRegEx 안에 존재하면, 그에 부합한 것들은 바탕 이름이 OutputVar인 의사-배열에 저장됩니다. 예를 들어, 변수의 이름이 Match라면, 첫 부패턴에 부합하는 부문자열은 Match1에 저장되고, 두 번째는 Match2에 저장됩니다, 등등. 이에 대한 예외는 이름 붙인 부패턴입니다: 숫자가 아니라 이름으로 저장됩니다. 예를 들어, 이름붙인 부패턴"(?P<Year>\d{4})" 에 부합한 부문자열은 MatchYear에 저장됩니다. 특정한 부패턴이 전혀 부합하지 않으면 (즉, 함수가 0을 돌려주면), 그에 상응하는 변수는 비워집니다.
함수 안에서, 지역이 아닌 전역 의사 배열을 생성하려면, 의사 배열의 바탕 이름을 사용하기 전에 (예, Match) 전역 변수로 선언 하십시오. 전역-간주 함수에 대하여 그 반대도 마찬가지입니다. 그렇지만, 흔한 혼란의 근원 때문에 각 원소마다 선언할 필요가 있는 경우도 있습니다.
Mode 2 (위치와 길이): 대문자 P가 RegEx의 옵션에 존재하면 -- 예를 들어 "P)abc.*123" --전체 패턴 부합의 길이가 OutputVar에 저장됩니다 (부합이 없으면 0). 나포 부패턴이 존재하면, 그 위치와 길이가 두 개의 의사-배열에 저장됩니다: OutputVarPos 그리고 OutputVarLen. 예를 들어, 변수의 바탕 이름이 Match라면, 첫 부패턴 부합의 위치가 1-기반으로 MatchPos1에 저장되고, 그의 길이는 MatchLen1에 저장됩니다 (부패턴에 부합이 없거나 함수가 0을 돌려주면 0이 저장됩니다). 이에 대한 예외는 이름붙인 부패턴입니다: 숫자가 아니라 이름으로 저장됩니다 (예, MatchPosYear 그리고 MatchLenYear).
Mode 3 (일치 객체) [v1.1.05+]: 대문자 O가 RegEx 옵션에 존재하면 -- 예를 들어 "O)abc.*123" -- 일치 객체가 UnquotedOutputVar에 저장됩니다. 이 객체를 사용하면 전체 부합과 나포된 부패턴 각각의 위치와 길이 그리고 값을 열람할 수 있습니다.
- StartingPosition
StartingPosition을 생략하면 기본값은 1입니다 (Haystack의 시작). 그렇지 않으면, 2를 지정해 두 번째 문자에서 시작하거나 3을 지정해 세 번째 문자에서 시작할 수 있습니다. 등등. StartingPosition이 Haystack의 길이를 넘어 가면, 검색은 Haystack 끝의 빈 문자열에서 시작합니다 (전형적으로 부합 결과가 없습니다).
StartingPosition이 보다 작으면, Haystack 끝으로부터의 상대거리고 간주합니다. 예를 들어, 0은 마지막 문자에서 시작하고, -1은 마지막 문자 바로 앞에서 시작합니다. StartingPosition이 Haystack의 왼쪽 끝을 넘어서 시도하면, 모든 Haystack을 검색합니다.
StartingPosition의 값에 상관없이, 반환 값은 언제나 Haystack의 첫 문자에 상대적입니다. 예를 들어, "123abc789"에서 "abc"의 위치는 언제나 4입니다.
ErrorLevel
[v1.1.04+] 이 함수는 실패시 예외를 던질 수 있습니다 ("부합 없음"과 혼동하지 마십시오). 더 자세한 정보는 실행시간 에러를 참조하십시오.
ErrorLevel은 다음 값중 하나가 설정됩니다:
- 0, 에러가 일어나지 않았다는 뜻입니다.
- 다음과 같은 형태의 문자열: Compile error N at offset M: description. 이 문자열에서, N은 PCRE 에러 번호이고, M은 정규 표현식 안에서의 범칙 문자의 위치입니다. 그리고 description은 그 에러를 설명하는 텍스트입니다.
- 음의 정수, 정규 표현식을 실행하는 동안에 에러가 일어났다는 뜻입니다. 그런 에러가 자주 일어나지는 않지만 일어난다면 다음과 같은 에러가 거의 대부분입니다: "too many possible empty-string matches" (-22), "recursion too deep" (-21), 그리고 "reached match limit" (-8). 이런 에러가 일어나면, 패턴을 더 엄격하게 재설계하십시오. 예를 들어 *를 ?, +로 교체하거나 가능하면 {0,3}과 같이 제한하십시오.
Options
수식자에 관해서 Options를 참조하십시오. 예를 들어 "i)abc"와 같은 경우, 패턴 "abc"에 대소문자 구분을 끕니다.
Match Object v1.1.05+
대문자 O가 RegEx 옵션에 존재하면, 일치 객체가 UnquotedOutputVar에 저장됩니다. 이 객체는 다음과 같은 특성을 소유합니다:
Match.Pos(N): 나포된 부패턴 또는 전체 부합의 위치를 돌려줍니다.
Match.Len(N): 나포된 부패턴 또는 전체 부합의 길이를 돌려줍니다.
Match.Value(N): 나포된 부패턴 또는 전체 부합을 돌려줍니다.
Match.Name(N): 주어진 부패턴의 이름을 돌려줍니다
Match.Count(): 부패턴의 전체 개수를 돌려줍니다.
Match.Mark(): 마지막으로 만난 (*MARK:NAME)
의 NAME을 돌려줍니다.
Match[N]: N이 0이거나 유효한 부패턴 번호 또는 이름이라면, 이것은 Match.Value(N)
과 동등합니다. 그렇지 않으면, N은 위의 특성의 이름 중 하나일 수 있습니다. 예를 들어, Match["Pos"]
그리고 Match.Pos
는 Match.Pos()
와 동등합니다. 단, 이름이 "Pos"인 부패턴이 존재하면 예외입니다. 이 경우 Match.Value("Pos")
와 동등합니다.
Match.N: 위와 같습니다. 단, N이 인용부호를 붙이지 않은 이름이거나 숫자인 경우는 예외입니다.
위의 모든 특성에 대하여, N은 다음 중 하나가 될 수 있습니다:
- 모든 부합하면 0.
- 부패턴의 번호, 이름붙은 부패턴도 마찬가지.
- 부패턴의 이름.
N을 지정하면 반괄호 () 대신에 각괄호 []를 사용해도 됩니다.
수행성능
문자열 안에서 간단한 부문자열을 검색하려면 InStr()을 사용하십시오. 왜냐하면 RegExMatch()보다 더 빠르기 때문입니다.
수행성능을 개선하기 위하여, 자주 사용되는 정규 표현식 100개를 메모리에 (컴파일된 형태로) 캐쉬합니다.
연구 옵션 (S)으로 종종 (예를 들어 회돌이 안에서) 많이 사용되는 정규 표현식의 수행성능을 개선시킬 수 있습니다.
논평
부패턴에 이름을 부여할 수 있습니다. 예를 들어 패턴 "(?P<Year>\d{4})"에 단어 Year가 부여 되어 있습니다. 이름은 최대 32개의 알파벳숫자와 밑줄 문자로 구성되니다. 다음 제한은 "O" (일치 객체) 모드에 적용되지 않습니다. 이름 붙인 부패턴도 RegEx 연산 자체에서 숫자로 참조할 수 있지만 (예, \1은 첫 나포 패턴에 실제로 부합한 문자열을 가리키는 역참조입니다), (숫자가 아니라) 이름으로만 출력 의사-변수에 저장됩니다. 예를 들어, "Year"가 첫 번째 부패턴이라면, OutputVarYear은 그 부합한 부문자열이 설정되지만, OutputVar1은 전혀 바뀌지 않습니다 (이전 값을 그대로 유지합니다). 그렇지만, 이름없는 부패턴이 "Year" 다음에 일어나면, 그것은 OutputVar1이 아니라 OutputVar2에 저장됩니다.
abc123와 같이 대부분의 문자는 정규 표현식 안에 기호 그대로 사용할 수 있습니다. 그렇지만, \.*?+[{|()^$와 같은 문자는 반드시 앞에 역사선을 배치해야 문자 그대로 보여지게 됩니다. 예를 들어, \.는 문자 그대로의 점이고 \\는 기호 그대로의 역사선입니다. 피신은 \Q...\E을 사용하여 대신할 수 있습니다. 예를 들어: \QLiteral Text\E
.
정규 표현식 안에서, 탭과 새줄 같은 특수 문자들은 액센트 (`) 또는 역사선 (\)으로 피신시킬 수 있습니다. 예를 들어, `t는 \t와 같습니다. 단, x 옵션이 사용된 경우는 예외입니다.
정규 표현식의 기본을 배우려면 (또는 패턴 구문을 새롭게 기억해 보려면), RegEx 간편 참조서를 참조하십시오.
오토핫키의 정규 표현식은 펄-호환의 정규 표현식 (PCRE)을 사용하여 구현되었습니다: www.pcre.org.
관련 항목
RegExReplace(), RegEx Quick Reference, 정규 표현식 외부요청, InStr(), IfInString, StringGetPos, SubStr(), SetTitleMatchMode RegEx, 전역적 일치와 Grep (포럼 링크)
텍스트 데이터를 얻는 흔한 방법: FileRead, UrlDownloadToFile, Clipboard, GUI 편집 콘트롤
예제
FoundPos := RegExMatch("xxxabc123xyz", "abc.*xyz") ; 4를 돌려줍니다, 부합이 발견된 위치입니다. FoundPos := RegExMatch("abc123123", "123$") ; $가 끝에 부합하기를 요구하기 때문에 7을 돌려줍니다. FoundPos := RegExMatch("abc123", "i)^ABC") ; 대소문자를 구분하지 않는 옵션을 통하여 부합했으므로 1을 돌려줍니다. FoundPos := RegExMatch("abcXYZ123", "abc(.*)123", SubPat) ; 1을 돌려주고 "XYZ"를 SubPat1에 저장합니다. FoundPos := RegExMatch("abc123abc456", "abc\d+", "", 2) ; 시작 위치가 1이 아니라 2이기 때문에 1 이 아니라 7을 돌려줍니다.. ; 일반적인 RegEx 예제들은 RegEx 간편 참조서를 참조하십시오.