51 - [오토핫키] 정규식 RegExMatch(), 파싱 (5)

    문자열관리를 통해서 찾고, 자르고, 바꾸고, 문자를 이리저리 고생시켰죠? 정규식은 문자, 혹은 문자 위치보다 문자열의 패턴을 읽어 분석합니다. 앞서 배운 문자열관리로 5~6줄의 스크립트 분량을 정규식을 사용하면 한줄로 끝내버릴 수 있을만큼 강력한 내장함수입니다. 흔히 정규식을 Haystack(건초더미)에서 NeedleRegEx(바늘)을 찾는다고 비유하는데 정말 그만큼 어렵습니다.

     

     

    문법

    FoundPos := RegExMatch(Haystack, NeedleRegEx [, UnquotedOutputVar = "", StartingPosition = 1])

     

    설명

    FoundPos

    NeedleRegEx의 위치값. 첫 문자라면 1, 발견하지 못했을 경우 0을 돌려줍니다.

    Haystack

    검색할 내용을 담고 있는 변수의 이름.

    NeedleRegEx

    검색할 문자열 패턴 (검색어). 정규 표현식으로 옵션과 패턴을 기입할 수 있습니다.

    UnquotedOutputVar

    Mode 1 (기본값) : 패턴 전체를 포함하는 Haystack을 저장할 변수의 이름.

    Mode 2 (위치와 길이) : 정규식 옵션에 P (대문자 P)가 있으면 전체 패턴의 글자 개수가 저장됩니다. (...) 부패턴이 있으면 위치와 길이가 의사배열로 저장 됩니다. 예를들어 변수의 이름이 Output이라면 OutputPos1에 위치값이 저장되고, OutputLen1에 글자수가 저장 됩니다.

    Mode 3 (일치 객체) : 정규식 옵션에 O (대문자 O)가 있으면 일치 객체가 UnquotedOutputVar에 저장됩니다. 아래 리스트 참조.

    StartingPosition

    검색을 시작할 위치. 기본값은 1

     

     

    예제

    애국가

    Data=
    (
    1. 동해물과 백두산이 마르고 닳도록
    하느님이 보우하사 우리나라 만세
    무궁화 삼천리 화려 강산
    대한 사람 대한으로 길이 보전하세

     

    2. 남산 위에 저 소나무 철갑을 두른 듯
    바람 서리 불변함은 우리 기상일세
    무궁화 삼천리 화려 강산
    대한 사람 대한으로 길이 보전하세

     

    3. 가을 하늘 공활한데 높고 구름 없이
    밝은 달은 우리 가슴 일편단심일세
    무궁화 삼천리 화려 강산
    대한 사람 대한으로 길이 보전하세

     

    4. 이 기상과 이 맘으로 충성을 다하여
    괴로우나 즐거우나 나라 사랑하세
    무궁화 삼천리 화려 강산
    대한 사람 대한으로 길이 보전하세
    )


    Pos := RegExMatch(Data, "동해물과 (.*?)이 (.*?)닳도록", Output)  ;(...) 괄호로 묶인 두개의 부패턴이 존재
      ;(.*?) 는 모든 문자를 찾는 만능 패턴입니다.

    MsgBox, %Pos%`n(패턴 전체의 위치값)
    MsgBox, %Output%`n(패턴 전체의 값)
    MsgBox, %Output1%`n(패턴의 첫번째 부패턴 값)
    MsgBox, %Output2%`n(패턴의 두번째 부패턴 값)

     

    RegExMatch(Data, "`n)바람(.*)", Output)  ;`n줄 단위로 읽는 옵션을 추가
    MsgBox, %Output%`n(``n줄을 읽는 옵션에 바람~ 한 줄을 읽음)

     

    Pos=0
    loop, 4
    {
    Pos := RegExMatch(Data, "`n)\d(.*)", Output, Pos+1) + StrLen(Output)  ;숫자로 시작하는 줄을 읽어옴. StrLen()으로 글자수를 더해주어 Output의 결과값이 끝나는 지점을 StartingPosition으로 다음 검색을 반복합니다.
      ;\=\ 한글자판에서는 \ (원 기호) 로 나오지만 국제적으로는 \ (역슬래시)가 맞습니다.

      ;\d 는 숫자를 찾는 패턴입니다.

    MsgBox, %Output%`n(줄을 읽는 옵션에 숫자로 시작하는 줄을 읽음)
    }

     

    Match Object (일치 객체)

    옵션에 O (대문자 O)가 포함 되어있으면 다음과 같은 객체 방식으로 열람을 합니다.

    Match.Pos(N) : 패턴의 위치를 돌려줍니다.

    Match.Len(N) : 패턴의 글자 개수를 돌려줍니다.

    Match.Value(N) : 패턴을 돌려줍니다.

    Match.Name(N) : 부패턴의 이름을 돌려줍니다.

    Match.Count() : 부패턴의 개수를 돌려줍니다.

    Match.Mark() : 마지막 (*MARK:NAME)의 NAME을 돌려줍니다.

    Match[N] : N에 부패턴 번호나 이름을 사용할 수 있습니다. 혹은 위의 특성 이름일 수 있습니다.

    Match.N : 위와 같습니다.

     

     

     

     

     

    Posted by 옹봉이