RegExMatch() [v1.0.45+]

문자열 안에서 패턴 (정규 표현식)에 부합하는 것들을 찾습니다.

FoundPos := RegExMatch(Haystack, NeedleRegEx , OutputVar, StartingPos := 1)

매개변수

Haystack

내용을 검색할 문자열.

NeedleRegEx

검색 할 패턴, 펄-호환의 정규 표현식입니다 (PCRE). 패턴의 옵션은 문자열 처음에 포함해야 하고 그 다음에 닫는 반괄호가 따라 옵니다. 예를 들어, 패턴 i)abc.*123는 대소문자 비구분 옵션을 켜고 "abc"를 검색 한 다음, 0개 이상의 문자를 검색하고, 다음에 "123"을 검색합니다. 옵션이 없다면, ")"는 선택적입니다; 예를 들어, )abcabc와 동등합니다.

OutputVar

Mode 1 (default): Specify a output variable in which to store the part of Haystack that matched the entire pattern. 패턴이 발견되지 않으면 (즉, 함수가 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 -- 일치 객체OutputVar에 저장됩니다. 이 객체를 사용하면 전체 부합과 나포된 부패턴 각각의 위치와 길이 그리고 값을 열람할 수 있습니다.

StartingPos

StartingPos를 생략하면, 1이 기본값이 됩니다 (Haystack의 시작). 그렇지 않으면, 2를 지정해 두 번째 문자에서 시작하거나 3을 지정해 세 번째 문자에서 시작할 수 있습니다. 등등. StartingPosHaystack의 길이를 넘어 가면, 검색은 Haystack 끝의 빈 문자열에서 시작합니다 (전형적으로 부합 결과가 없습니다).

StartingPos이 보다 작으면, Haystack 끝으로부터의 상대거리고 간주합니다. 예를 들어, 0은 마지막 문자에서 시작하고, -1은 마지막 문자 바로 앞에서 시작합니다. StartingPosHaystack의 왼쪽 끝을 넘어서 시도하면, 모든 Haystack을 검색합니다.

StartingPos의 값에 상관없이, 반환 값은 언제나 Haystack의 첫 문자에 상대적입니다. 예를 들어, "123abc789"에서 "abc" 의 위치는 언제나 4입니다.

반환 값

이 함수는 문자열 HaystackNeedleRegEx가 나타난 가장 왼쪽의 위치를 돌려줍니다. 위치가 1이면 첫 번째 문자입니다. 패턴이 발견되지 않으면 0을 돌려줍니다. 에러가 일어나면 (NeedleRegEx 안에서 구문 에러가 일어나면), 빈 문자열이 반환됩니다. ErrorLevel은 0 대신에 아래의 값 중 하나가 사용됩니다.

에러 처리

[v1.1.04+]: 이 함수는 실패시 예외를 던질 수 있습니다 ("부합 없음"과 혼동하지 마십시오). 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 다음 값중 하나가 설정됩니다:

Options

수식자에 관해서 Options를 참조하십시오. 예를 들어 i)abc와 같은 경우, 패턴 "abc"에 대소문자 구분을 끕니다.

Match Object [v1.1.05+]

대문자 O가 RegEx 옵션에 존재하면, 일치 객체가 OutputVar에 저장됩니다. This object has the following methods and properties:

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)과 동등합니다. Otherwise, N can be the name of one of the above methods. 예를 들어, Match["Pos"] 그리고 Match.PosMatch.Pos()와 동등합니다. 단, 이름이 "Pos"인 부패턴이 존재하면 예외입니다. 이 경우 Match.Value("Pos")와 동등합니다.

Match.N: 위와 같습니다. 단, N이 인용부호를 붙이지 않은 이름이거나 숫자인 경우는 예외입니다.

For all of the above methods and properties, N can be any of the following:

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.

[AHK_L 31+]: Within an expression, the a ~= b can be used as shorthand for RegExMatch(a, b).

RegExReplace(), RegEx Quick Reference, 정규 표현식 외부요청, InStr(), IfInString, StringGetPos, SubStr(), SetTitleMatchMode RegEx, 전역적 일치와 Grep (포럼 링크)

텍스트 데이터를 얻는 흔한 방법: FileRead, UrlDownloadToFile, Clipboard, GUI 편집 콘트롤

예제

일반적인 RegEx 예제들은 RegEx 간편 참조서를 참조하십시오.

Reports 4, which is the position where the match was found.

MsgBox % RegExMatch("xxxabc123xyz", "abc.*xyz")

Reports 7 because the $ requires the match to be at the end.

MsgBox % RegExMatch("abc123123", "123$")

Reports 1 because a match was achieved via the case-insensitive option.

MsgBox % RegExMatch("abc123", "i)^ABC")

Reports 1 and stores "XYZ" in SubPat1.

MsgBox % RegExMatch("abcXYZ123", "abc(.*)123", SubPat)

Reports 7 instead of 1 due to the starting position 2 instead of 1.

MsgBox % RegExMatch("abc123abc456", "abc\d+",, 2)

Demonstrates the usage of the Match object.

FoundPos := RegExMatch("Michiganroad 72", "O)(.*) (?<nr>\d+)", SubPat)  ; The starting "O)" turns SubPat into an object.
Msgbox % SubPat.Count() ": " SubPat.Value(1) " " SubPat.Name(2) "=" SubPat["nr"]  ; Displays "2: Michiganroad nr=72"

Retrieves the extension of a file. Note that SplitPath can also be used for this, which is more reliable.

Path := "C:\Foo\Bar\Baz.txt"
RegExMatch(Path, "\w+$", Extension)
MsgBox % Extension  ; Reports "txt".

Similar to Transform Deref, the following function expands variable references and escape sequences contained inside other variables. Furthermore, this example shows how to find all matches in a string rather than stopping at the first match (similar to the g flag in JavaScript's RegEx).

var1 := "abc"
var2 := 123
MsgBox % Deref("%var1%def%var2%")  ; Reports abcdef123.

Deref(String)
{
    spo := 1
    out := ""
    while (fpo:=RegexMatch(String, "(%(.*?)%)|``(.)", m, spo))
    {
        out .= SubStr(String, spo, fpo-spo)
        spo := fpo + StrLen(m)
        if (m1)
            out .= %m2%
        else switch (m3)
        {
            case "a": out .= "`a"
            case "b": out .= "`b"
            case "f": out .= "`f"
            case "n": out .= "`n"
            case "r": out .= "`r"
            case "t": out .= "`t"
            case "v": out .= "`v"
            default: out .= m3
        }
    }
    return out SubStr(String, spo)
}