RegExMatch 는 정규식이라 불리는 파싱 명령어입니다.
정규식은 모습이 되게 어려워 보여요. 그래도 쓰는 이유가 무엇이냐면 더 간편하게 파싱을 하기 위해서이죠.
StringGetPos 와 같이 쓰이는 파싱 명령어는 정규식 한 줄로 될걸 7~8 줄 이상으로 쓰이는 경우가 많아요.
그래서 정규식을 쓰는 거예요.
일단 함수 원형은 이렇습니다.
찾은 위치 := RegExMatch(문자열,찾을문자열[,변수 = "",시작할위치 = 1])
[] 안의 내용은 생략 가능합니다.
일단 정규식 옵션부터 알아야 돼요. 그래야 정규식을 쓰죠. 대충 필요한 것만 알면 돼요.
.* (.*) ? i) \C $ \d \w [0-9] + . [A-Z] [a-z] 이런 거요.
밑에 요약 처리해놓은 것은 보셔야 정규식 할 수가 있을 거예요.
정규식 참조 번역 ( 등등등 여러 가지 )
기본요인
어디서든 일치한다(Match anywhere) : 기본적으로 RegEx는 검색될 문자열 안에 어디든 문자열과 일치합니다.
예로 들어, RegEx abc는 abc123 , 123abc, and 123abcxyz 에 일치한다.
처음과 끝에 오직 발생 요구하는 일치는 achor( ^ , $ ) 을 사용한다.
확장문자(Escaped characters) : abc123 같은 대부분 문자열은 그대로 RegEx 안에서 사용될 수 있다.
그러나, 문자 \.*?+[{|()^$ 은 문자열 그대로 볼 수 있게 하려면 \ 를 써야 합니다.
예로 들어, \.은 . 이고 \\은 \ 입니다.이스케이프(Escaping)는 \Q ... \E 를 사용하여 피할 수 있습니다.
예로 들어 , \Q문자열\E.
대소문자 구분(Case-sensitive) : 기본적으로, RegEx는 대소문자 구분이 있다.
이것은 "i" 옵션을 통해 변환할 수 있다.
예로 들어, 패턴 i)abc 는 대소문자에 관계없이 "abc" 를 찾는다.
밑에 내용을 더 봐라.
옵션(Options - case sensitive)
RegEx 처음에, 옵션 0개 이상에는 )가 따라오게 된다.
예로 들어, 패턴 "im)abc" 대소 문자 구분 X 옵션과 여러 줄(Multiline) 옵션과 함께 abc를 찾게 된다.
( 괄호는 아무 옵션이 없을 때 생략 가능하다. )
비록 이 구문이 평소의 방식이 아니지만 , 이 구문은 특별한 문자들( / 같은 것들) 필요하지 않고
이렇게 패턴 안에 구분 같은 이스케이프(Escape)가 필요 없다.
게다가 성능이 향상된다 왜냐하면 옵션들은 파싱 하기에 더 쉽기 때문이다.
i | 대소문자 구별X 매칭은 소문자를 A-Z 와 같이 처리한다. |
m | 여러줄.(Multiline.) 문자열(Haystack) 각각의줄을 볼때 ( 새로운 줄들이 포함되어있을 경우) 차라리 한개의 끊임없는 줄이 낳다. 특히 , 그것은 다음의 것으로 바뀐다. 1) ^ ( Circumflex) 는 바로 모든 내부의 줄바꿈 후에 매치된다. 뿐만 아니라 문자열(Haystack) 의 시작점에서 그것은 항상 매치된다. (하지만 그것은 Haystack의 맨끝에서 새로운 줄 이후에는 매치되지 않는다.) 2) $ ( Dollar-sign) 은 문자열(Haystack) 안에 어떤 새로운 줄 전에 매치된다. (뿐만 아니라 맨 끝에서 그것은 항상 매치된다.) 예로들어, 패턴 "m)^abc$" 는 문자열(Haystack) "xyz`r`nabc" 에서 m 옵션이 존재하지 않는다면 매치되지 않을것이다. "D" 옵션은 m옵션이 존재할 때 무시당하게 된다. |
s | DotAll. 이것은 .(period) 을 \n도 포함해서 매치 하게 한다 (일반적으로, 그것은 새로운 매치하지않는다). 하지만 새로운 줄 문자 (\n) 이 개행문자 `r `n (CRLF) 의 기본인 경우, 두점이 그것을 매치하기 위해 요구된다.(하나가 아니다). 옵션에 관계없이 , [^a] 같은 Negative 종류는 \n 과 매치한다. |
x | Ignores whitespace characters in the pattern except when escaped or inside a character class. The characters `n and `t are among those ignored because by the time they get to PCRE, they are already raw/literal whitespace characters (by contrast, \n and \t are not ignored because they are PCRE escape sequences). The x option also ignores characters between a non-escaped # outside a character class and the next newline character, inclusive. This makes it possible to include comments inside complicated patterns. However, this applies only to data characters; whitespace may never appear within special character sequences such as (?(, which begins a conditional subpattern. |
A | 그 패턴을 고정시켜버린다. ; 이말은 그것은 오직 문자열(Haystack)의 시작점에서 매치할수있다. 대부분의 조건 하에서 동등하게 명시적으로 ^ 같은 의미에 의해 그 패턴이 고정된다. |
D | $ (dollar-sign) 은 문자열(Haystack) 의 맨끝에 매치한다. 만약 문자열(Haystack)의 마지막 item이 \n 일지라도. 이 옵션을 사용하지 않으면 , $ 대신에 오른쪽 마지막 줄 바꿈하기 전에 일치합니다. |
J | 중복되는 subpatterns 를 허락한다. 이것은 패턴안에서 동일 매치될수있는 서브패턴 에서 유용할 수 있다. Note: If more than one instance of a particular name matches something, only the leftmost one is stored. Also, variable names are not case-sensitive. |
U | 탐욕스럽지 않은 ( Ungreedy ) . *+?{} (quantifiers) 는 절대적으로 매치 형태에서 필요하다 저 문자열들을 consume 하게 만들고 , 패턴의 다음부분에서 이용할수있게 남아있게 한다. "U" 옵션이 적용 되지 않을때 , 물음표가 각각 quantifiers 를 탐욕스럽게 만든다. |
X | PCRE_EXTRA. Enables PCRE features that are incompatible with Perl. Currently, the only such feature is that any backslash in a pattern that is followed by a letter that has no special meaning causes the match to fail and ErrorLevel to be set accordingly. This option helps reserve unused backslash sequences for future use. Without this option, a backslash followed by a letter with no special meaning is treated as a literal (e.g. \g and g are both recognized as a literal g). Regardless of this option, non-alphabetic backslash sequences that have no special meaning are always treated as literals (e.g. \/ and / are both recognized as forward-slash). |
P | 위치 모드. RegExMatch() 매치되는것의 위치와 길이의 값의 원인이 된다. 더 자세한것은 Help File 에서 UnquotedOutputVar 을 봐라. |
S | Studies the pattern to try improve its performance. This is useful when a particular pattern (especially a complex one) will be executed many times. If PCRE finds a way to improve performance, that discovery is stored alongside the pattern in the cache for use by subsequent executions of the same pattern (subsequent uses of that pattern should also specify the S option because finding a match in the cache requires that the option letters exactly match, including their order). |
C | 자동 Callout 모드를 허용하다. pcre_callout 에 call 할 함수의 이름을 넣고 RegExMatch("xxxabc123xyz", "C)abc.*xyz") 처럼 쓰면 자동적으로 pcre_callout 에 들어있는 함수의 이름을 가진 함수를 실행 시킨다. 자세한것은 Help File 에서 C에서 자세히 봐라. 사용법이 나와있을 것이다. |
`n | 개행문자중 엔터 를 의미한다. 줄바꿈을 의미한다. |
`r | 캐리지리턴을 의미한다. |
`a | In v1.0.46.06+, `a recognizes any type of newline, namely `r, `n, `r`n, `v/VT/vertical tab/chr(0xB), `f/FF/formfeed/chr(0xC), and NEL/next-line/chr(0x85). In v1.0.47.05+, newlines can be restricted to only CR, LF, and CRLF by instead specifying (*ANYCRLF) in uppercase at the beginning of the pattern (after the options); e.g. im)(*ANYCRLF)^abc$ |
이제 옵션이 끝났고요.
이제 구문안에서 상징적인 문자열을 사용하는 것을 보죠.
일반적으로 사용되는 상징적 문자와 구문
. | 기본적으로, . 은 newline(`r`n) 의 일부가 아닌 single 문자 매치한다. 하지만 이것이 using the DotAll (s), linefeed (`n), carriage return (`r), `a or (*ANYCRLF) 옵션을 사용에 의해서 바뀔수 있다. 예로들어, ab. 은 abc , abz 그리고 ab_ 와 매치된다. |
* | * 는 선행문자,class,서브패턴 앞에 매치한다. 예로들어 , a* 는 abc 와 aaab 와 매치한다. 그것은 또한 모든 문자열에 a가 맨처음에 포함되어있는 것은 매치한다. Wildcard: .* 패턴은 대부분 허용하는것중 하나이다. 왜냐하면 그것은 다른 문자열의 발생과 매치한다 (newline 을 제외한다. : `r and `n). 예로들어 , abc.*123 은 abcAnything123 뿐만아니라 abc123 과일치한다. |
? | A question mark matches zero or one of the preceding character, class, or subpattern. Think of this as "the preceding item is optional". For example, colou?r matches both color and colour because the "u" is optional. |
+ | + 표시는 선행문자에 매치한다. 예로들어 a+ 는 ab and aaab 와 매치한다. 하지만 a* 그리고 a? 와 달리 패턴 a+ 는 시작하는 문자열의 앞에 매치하지 않는다. |
{min}, {max} |
min 과 max 사이에서 발생하는 선행문자와 매치한다. 예로들어 , a{1,2} 는 ab와 매치하지만 오직 두개의 a만 매치한다. aaab 처럼 말이다. {3}은 3 발생을 의미하고 {3,} 은 3이상의 발생을 의미한다.최대 65536 이다. |
[...] | [] 로 범위를 나타낼수 있다. 예로들어, [abc]는 a나 b나 c 모두를 의미한다. 이번엔 범위처럼 써보자. 예로들어 [a-z]는 소문자 a~z 중 아무거나. 라는 뜻이다. 이번엔 여러개의 범위를 써보자. [a-zA-Z0-9] 0~9 와 소문자 대문자 모두 를 의미한다. 만약 [0-9]+ 를 쓴다고 한다면 이것은 xyz123 이나 123xyz 나 xyz1이나 xyz12 같은 문자열과 매치가 될수가있다. +로 반복이 되는것이다. The following POSIX named sets are also supported via the form [[:xxx:]], where xxx is one of the following words: alnum, alpha, ascii (0-127), blank (space or tab), cntrl (control character), digit (0-9), xdigit (hex digit), print, graph (print excluding space), punct, lower, upper, space (whitespace), word (same as \w). Within a character class, characters do not need to be escaped except when they have special meaning inside a class; e.g. [\^a], [a\-b], [a\]], and [\\a]. |
[^...] | class안에 있는 문자가 아닌 것과 매치한다. 예로들어 [^/]* ( *은 반복을 의미) 는 http://과 매치한다. |
\d | [0-9] 숫자를 의미한다. [0-9]+ 와 \d+ 는 같은의미다. |
\s | Matches any single whitespace character, mainly space, tab, and newline (`r and `n). Conversely, capital \S means "any non-whitespace character". |
\w | 단어들과 매치한다. 숫자와도 매치한다. 어떤 문자든지 매치한다. namely alphanumeric or underscore. This is equivalent to [a-zA-Z0-9_]. Conversely, capital \W means "any non-word character". |
^ $ |
^는 시작하는 부분에서 매치한다. ^abc는 abc123과는 매치하지만 123abc는 그렇지 않다. $는 끝과 매치한다. abc$ 는 123abc 과는 매치하지만 abc123 과는 아니다. The two anchors may be combined. For example, ^abc$ matches only abc (i.e. there must be no other characters before or after it). If the text being searched contains multiple lines, the anchors can be made to apply to each line rather than the text as a whole by means of the "m" option. For example, m)^abc$ matches 123`r`nabc`r`n789. But without the "m" option, it wouldn't match. |
\b | \b means "word boundary", which is like an anchor because it doesn't consume any characters. It requires the current character's status as a word character (\w) to be the opposite of the previous character's. It is typically used to avoid accidentally matching a word that appears inside some other word. For example, \bcat\b doesn't match catfish, but it matches cat regardless of what punctuation and whitespace surrounds it. Capital \B is the opposite: it requires that the current character not be at a word boundary. |
| | The vertical bar separates two or more alternatives. A match occurs if any of the alternatives is satisfied. For example, gray|grey matches both gray and grey. Similarly, the pattern gr(a|e)y does the same thing with the help of the parentheses described below. 한글로 말하자면 | 는 구분해서 함께 쓸수있게 해주는 것인데. gray|grey 는 gray 와 grey 모두를 의미하며 gr(a|e)y 과 같이쓴다. |
(...) | Items enclosed in parentheses are most commonly used to:
|
\t \r etc. |
These escape sequences stand for special characters. The most common ones are \t (tab), \r (carriage return), and \n (linefeed). In AutoHotkey, an accent (`) may optionally be used in place of the backslash in these cases. Escape sequences in the form \xhh are also supported, in which hh is the hex code of any ANSI character between 00 and FF. In v1.0.46.06+, \R means "any single newline of any type", namely those listed at the `a option (however, \R inside a character class is merely the letter "R"). In v1.0.47.05+, \R can be restricted to CR, LF, and CRLF by specifying (*BSR_ANYCRLF) in uppercase at the beginning of the pattern (after the options); e.g. im)(*BSR_ANYCRLF)abc\Rxyz |
\p{xx} \P{xx} \X |
[AHK_L 61+]: Unicode character properties. Not supported on ANSI builds. \p{xx} matches a character with the xx property while \P{xx} matches any character without the xx property. For example, \pL matches any letter and \p{Lu} matches any upper-case letter. \X matches any number of characters that form an extended Unicode sequence. For a full list of supported property names and other details, search for "\p{xx}" at www.pcre.org/pcre.txt. |
(*UCP) | [AHK_L 61+]: For performance, \d, \D, \s, \S, \w, \W, \b and \B recognize only ASCII characters by default, even on Unicode builds. If the pattern begins with (*UCP), Unicode properties will be used to determine which characters match. For example, \w becomes equivalent to [\p{L}\p{N}_] and \d becomes equivalent to \p{Nd}. |
뒷부분으로 갈수록 영어로 되어있습니다.
간단한 예제 번역
FoundPos := RegExMatch("xxxabc123xyz","abc.*xyz")
; 4가 반환된다. 매치돼서 찾아진 곳의 위치이다 ..* 에의해 123이 .*에 해당된다.
FoundPos := RegExMatch("abc123123", "123$")
; 7을 반환한다. 왜냐하면 $은 맨 끝과 매치해서 끝의 123과 매치하게 되서다.
FoundPos := RegExMatch("abc123", "i)^ABC")
; 1을 반환한다. 대소문자 구분 X옵션을 통해 찾아져서다.
FoundPos := RegExMatch("abcXYZ123", "abc(.*)123", SubPat)
; 1이 반환되며 SubPat에는 abcXYZ123 이 위치하게 된다. SubPat1 에는 XYZ 가 저장된다.
FoundPos := RegExMatch("abc123abc456", "abc\d+", "", 2)
; 7을 반환한다. 처음 발견될 123이 아닌 2에서부터 시작해서 456쪽이 발견된 것이다.
기초적인 정규식에서는
위치 := RegExMatch("abc123xyz","abc(.*)xyz",var)
msgbox,% var1
결과가 123이라는 정도만 알면 된다.
그리고 따옴표를 패턴 안에 넣으면 에러가 뜬다.
오핫 정규식에서 \를 쓰면 문자 그대로 쓰게 된다고 한다.
하지만 \" 를 써도 에러가 뜬다.
\C 를 쓰면 " 의 효과를 볼 수 있을 것이다.
----
그러므로 이 기초적인 정규식에서는 (.*) 와 \C 만 알아도 사실문제없이 잘할 수 있을 거예요
[0-9] 나 [a-zA-Z] + 도 알아야 되고요.
\C를 쓴 예제도 한번 그럼 보죠.
Haystack="블로그"123456"그로블"
FoundPos := RegExMatch(Haystack,"블로그\C(.*)\C그로블",var) ;; var1 에 123456 이 저장된다.
RegExReplace() 에 대해서는 설명하지 않겠습니다.
RegExMatch 와 옵션은 똑같고
함수 형태만 아시면 쉽게 쓰실 수 있어요.