440 likes | 755 Views
Regular Expressions : JavaScript, VBScript &T-SQL. 차례. Mastering Regular Expressions JavaScript RegExp VBScript RegExp T-SQL RegExp. Mastering Regular Expressions. 정규표현식이란 ?. 텍스트의 패턴을 매치하기위해 사용되는 문장과 기호의 집합 2가지 규칙 가장 먼저 시작하는 매치가 우선된다 표준 수량자( quantifier) 는 탐욕스럽다 단순한 예 a cat
E N D
차례 • Mastering Regular Expressions • JavaScript RegExp • VBScript RegExp • T-SQL RegExp
정규표현식이란? • 텍스트의 패턴을 매치하기위해 사용되는 문장과 기호의 집합 • 2가지 규칙 • 가장 먼저 시작하는 매치가 우선된다 • 표준 수량자(quantifier)는 탐욕스럽다 • 단순한 예 • a • cat • 순서대로 세개의 문자 • cat, category, Catty
문자표현법 • 문자약어 • \a - 경고, \b – 백스페이스, \n - 줄바꿈문자, • \r - 캐리지리턴 , \t – 일반탭, \v – 수직탭 • 8진수 이스케이프 • \015\012 - CR/LF • 16진수 및 유니코드 이스케이프 • \x0D\x0A – CR/LF • 제어문자 • \cH – Control-H
문자클래스-1 • 일반클래스 • [...] – 클래스내의 임의의문자 • [^...] – 부정형, 열거되지 않은 문자에 매치, 클래스내에선 행시작이 아님 • [Aa] – A or a • gr[ae]y – grey or gray • [Cc]at – Cat or cat • [^0-9] – 숫자가 아님 • q[^u] – q 다음에 u 가 아닌 어떤것에 매치 • Iraq, Iraqi
문자클래스-2 • 문자범위 • [a-z] –a,b,c…,z • [A-Z], [0-9], [a-zA-Z0-9], [-a-z] • 클래스약어 • \w = [a-zA-Z0-9_], \W = [^\w] • \d = [0-9], \D = [^\d] • \s = [ \f\n\r\t\v], \S = [^\s] • \W\w\w\w\w\w\W • \s\D\S\W\s
문자클래스-3 • Dot (.) – 임의의 문자 • 일반적으로 영숫자, 공백, 탭, 특수문자 • newline제외 (옵션, 엔진에 따라, 윈:\r\n, 유:\n) • 클래스내에 . 을 사용하면[.] 매타문자 아님 • 07.31.1973 • 07.31.1973 • 8789907631197378 • 07[-./]31[-./]1973
앵커및 위치표기용 메타문자 • 행및 문자열시작 : ^, \A – 단어끝 과 \n 사이 • 행및 문자열의 끝 : $, \Z, \z • ^,\A 와 $,\Z는 일반적으로 동일 • /m 인경우엔 \A, \Z는 문장시작, 끝 • 폼 입력값검사시엔 대부분 ^…$ • 매치시작위치(이전매치끝위치) : \G • 단어경계 : \b, \B = [^\b], \<, \> • ^cat$ - 행시작 cat 행끝 • ^$ - 빈행
주석및 모드변경자 • 다중행모드(multi-line) : m • ^, $ 이 newline 의 앞뒤에 매치 • 단일행모드(single-line) : s • Dot (.) 에 newline 을 포함 • 대소문자무시모드 : i • 공백무시모드 : x • 모드변경자 (?mod:…) • (?i)te(?-i)st – TEst , Test(o), teST, TEST(x) • 주석 (?#...)
선택 • 선택 : …|… • 둘중에 하나를 선택 • Cat|cat = Cat or cat = (C|c)at • Jeffrey • /Jeffrey|Jeffery/ • /Jeff(rey|ery)/ • /Jeff(re|er)y/ • get|getvalue|set|setvalue • “setvalue” 에 “set” 만 매치 • 위치바꿈 • \bget(value)?|set(value)?\b • \b(get|set)(value)?\b
수량자-1 • 표준수량자 : 탐욕스럽다 (greedy) • * : 0...N • ? : 0,1 • + : 1…N • {n, n}, {n, }, {n} • [A-Za-z]* • colou?r - color or colour • <a>.*</a> • <a[^>]*> - 속성포함 또는 포함않한 <a> 태그 • <a +href=“[^”]+” *> - href속성만 갖는 <a> 태그 • <a *(href=“[^”]+”)? *>
수량자-2 • 느슨한 수량자(lazy) • *?, ??, +?, {n, n}? – 가능하면 작은 문자열로 매치 • <a>.*?</a> • 소유수량자 • *+, ?+, ++, {n, n}+ - 백트래킹을 하지 않음
백레퍼런스 • 정규식내의 부분의 매치를 저장하고 변수에 저장하기 위해 둥근괄호 () 사용 • \1,\2,\3, … , \9 • (\s[a-zA-Z]*)\1 • ((^.{0,5})([0-9]+)\s*$) 순서 • 1 - ((^.{0,5})([0-9]+)\s*$) • 2 - (^.{0,5}) • 3 - ([0-9]+) • <([A-Z][A-Z0-9]*)[^>]*>.*?</\1> • ([A-C])x\1x\1 => AxAxAx, BxBxBx, AxBxCx • ([abc]+) ▶ \1, ([abc])+ ▶ \1 • \b(\W+)\s+\1\b => 중복단어 수정
그룹지정, 캡처 • 캡처/그룹지정용괄호 : (…), $1,$2 • <a[^>]*>(.*)</a> - 괄호의 내용이 $1에 캡처 • 그룹지정전용괄호 : (?:…) • 캡처않함, 백레퍼런스 사용안함 => 속도 빠름 • 이름이있는캡처 : (?<name>…) • 매치되는 내용을 이름으로 캡처 • 원자그룹지정 : (?>…) – 백트래킹 않음 • 괄호를 하나의 토큰으로 취급 • (x++) = (?>x) • “1234567898” \d+6 (o) , \d++ (x)
룩어라운드 • 실제로 문자열에 매치되는 것은 아님 • 룩어헤드 : • 다음에 올 문자열을 포함해 매치여부 판단 • 긍정형 : (?=…) – 다음에 문자열이 있는지 • 부정형 : (?!...) – 다음에 문자열이 없는지 • 룩비하인드 • 긍정형 : (?<=…) – 전에 문자열이 있는지 • 부정형 : (?<!...) – 전에 문자열이 없는지
룩어라운드-예제 • Jeffs -> Jeff’s • s/\bJeffs\b/\bJeff’s\b/g • => s/\b(Jeff)(s)\b/$1’$2/g • =>s/\bJeff(?=s\b)/\bJeff’/g • => s/(?<=\bJeff)(?=s\b)/’/g – 문자열에 매치되는 것이 아니라 “위치” 매치됨 • s/(?=s\b)(?<=\bJeff)/’/g 숫자에 천단위 쉼표 s/(?<=d)(?=(\d\d\d)+(?!\d))/,/g -> 1234Hz , 1980s , … 중복문자제거 s/(\w)+\s\1/$1/g – “the the the” s/(\w)+\s(?=\1)//g quit q(?=u) q(?=u)i – 항상X
정규식 선언 • 정규식생성자를 이용 • var rev = new RegExp(“s”,“gim”); • g – 전체문장내모든매치, i – 대소문자구분없음, m – 다중행 허용 • 정규식문자를 사용한 일반적 선언 • var searchTermRE = /X1X4/gim;
특수문자 • \t, \n, \0(Null 문자) • ., ^, $ • A-Z, a-z, 0-9 • *, +, ?, • \*, \+, \?, \$, \^ - 매타문자를 문자로
예제 : lop, mop, bop, sop, pop, gop, top, fop var re = /.op/; var re = /[blp]op/; var re = /[a-m]op/; var re = /[^blp]op/; var re = /[^a-m]op/; : bonk,onk,bbonk,bbbonk var re = /b?onk/; var re = /b*onk/; var re = /b+onk/; var re = /b{2}onk/; var re = /b{1,3}onk/;
ReExp.test(str) • 테스트될 문자열에 대해서 패턴에 매치여부를 Boolean 으로 반환 var re = new RegExp(“t$”); function Validate(en) { return re.test(en); } function ShowPrompt() { var en = prompt(“Type your text here.”); if (Validate(en) { alert(“There is a match!”); } else { alert(“There is no matchi!”); } }
ReExp.exec(str) • 매칭되는 문자를 모두 배열로 반환 function RegExpTest(){ var ver = Number(ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion()) if (ver >= 5.5){ var src = "The rain in Spain falls mainly in the plain."; var re = /\w+/g; var arr; while ((arr = re.exec(src)) != null) document.write(arr.index + "-" + arr.lastIndex + "\t" + arr); } else{ alert("You need a newer version of JScript for this to work"); } }
String.search() Method • 매칭되는 문자의 첫위치를 반환 • 매칭되는 문자가 없을 경우 -1 을 반환 • /g 모드를 무시 function SearchDemo(){ var r, re; var s = "The rain in Spain falls mainly in the plain."; re = /falls/i; r = s.search(re); return(r); }
String.match() Method • 매칭되는 문자를 모두 배열로 반환 • /g 모드에서도 실행 function checkPhoneNumber(phoneNo) { var re = /^\(\d\d\d\) \d\d\d-\d\d\d\d$/; if (phoneNo.match(re)) { return true; } else { return false; } }
String.replace() Method • 매치되는 문자를 지정된 문자로 변환 • /g 모드에서도 실행 function autoCorrect(theString) { theString = theString.replace(/([abd-z])ei/gi,”$1ie”); return theString; } function ReplaceDemo(){ var r, re; var ss = "The rain in Spain falls mainly in the plain."; re = /(\S+)(\s+)(\S+)/g; r = ss.replace(re, "$3$2$1"); return(r); }
그룹, 캡처 • 정규식내에서 괄호를 \1, \2,...,\9 로 대치하여 반복하여 사용할 수 있음 • 정규식 괄호내의 패턴에 매치되는 문자를 $1, $2,.., $9 로 받을수 있음 // somename.html.html -> somename.html matchStr = /(\b\w+)\.(\w+)\.\2\b/g; FilesString.replace(matchStr, $1+'.'+$2);
선언 • 생성 • Set re = new RegExp • 속성 • Pattern : 정규식구문 • IgnoreCase : 대소문자구분여부 • Global : 전체문장의 모든매치 Set re = new RegExp re.Pattern = “[A-Z]\d” re.IgnoreCase = True re.Global = False
매타문자 • […],[^…] • \t, • \b,\B, \d,\D, \s,\S, \w,\W • ^,$ • *,+,?,{n, m} • (…), (?:…), (?=…), (?!...) • …|…
RegExp.Test(string) • 테스트될 문자열의 패턴 매치여부를 Boolean 으로 반환 MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4")) Function RegExpTest(patrn, strng) Dim regEx, retVal Set regEx = New RegExp regEx.Pattern = patrn regEx.IgnoreCase = False retVal = regEx.Test(strng) If retVal Then RegExpTest = "One or more matches were found." Else RegExpTest = "No match was found." End If End Function
RegExp.Replace(string) • 패턴에 매치되는 문자를 다른문자로 바꿈 • 캡처할수 있음 MsgBox(RegExpReplace(“John Smith")) Function RegExpReplace(strng) Dim regEx, retVal Set regEx = New RegExp regEx.Pattern = “(\S+)(\s+)(\S+)” retVal = regEx.Replace(strng, “$3, $2$1”) End Function
RegExp.Execute(string) • Matches 컬렉션을 반환 Function RegExpTest(patrn, strng) Dim regEx, Match, Matches Set regEx = New RegExp regEx.Pattern = patrn regEx.IgnoreCase = True regEx.Global = True Set Matches = regEx.Execute(strng) For Each Match in Matches RetStr = RetStr & "Match found at position " RetStr = RetStr & Match.FirstIndex & ". Match Value is RetStr = RetStr & Match.Value & " Next RegExpTest = RetStr End Function MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))
지원 • Like ‘A%’, like ‘a_’ • A.*, a. • Like ‘[a-z]%’, like ‘[^abc]%’ • [a-z].* , [^abc].* • PATINDEX(‘%ABC%’, ColNm) • 패턴이 시작되는 처음 위치, 없으면 0 을 반환
RegExp Object – 생성 Create Function dbo.regexObj ( @regexp varchar(1000), @global bit = 0, @ignoreCase bit = 0 ) Returns Integer As Begin Declare @hr integer Declare @objRegExp integer Execute @hr = xp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT If @hr <> 0 Begin Return NULL End Execute @hr = xp_OASetProperty @objRegExp, 'Pattern', @regexp If @hr <> 0 Begin Return NULL End Execute @hr = xp_OASetProperty @objRegExp, 'Global', @global If @hr <> 0 Begin Return NULL End Execute @hr = xp_OASetProperty @objRegExp, 'IgnoreCase', @ignoreCase If @hr <> 0 Begin Return NULL End Return @objRegExp End
RegExp Object - Test CREATE FUNCTION dbo.regexObjTest ( @objRegExp integer, @source varchar(5000) ) RETURNS bit AS BEGIN DECLARE @hr integer DECLARE @results bit EXECUTE @hr = sp_OAMethod @objRegExp, 'Test', @results OUTPUT, @source IF @hr <> 0 BEGIN RETURN NULL END RETURN @results END GO
RegExp Object – Replace CREATE FUNCTION dbo.regexObjReplace ( @objRegExp integer, @source varchar(5000), @replace varchar(1000) ) RETURNS varchar(1000) AS BEGIN DECLARE @hr integer DECLARE @result varchar(5000) EXECUTE @hr = sp_OAMethod @objRegExp, 'Replace', @result OUTPUT, @source, @replace IF @hr <> 0 BEGIN RETURN NULL END RETURN @result END GO
RegExp Object - 예제 • 패턴에 매치여부 • 패턴에 매치되는 문자바꿈 • 패턴에 매치여부 • Declare @regexp integer • Set @regexp = dbo.regexpObj(‘[^a-z]’, 0, 1); • Select * From Account • Where odo.regexpObjTest(@regexp, colnm) = 1 • 패턴에 매치되는 문자바꿈 • Declare @regexp integer • Set @regexp = dbo.regexpObj(‘[^a-z]’, 1,1); • Select dbo.regexpObjReplace(@regexp, colnm, ‘’) • From Account
정규식만들기 • Com, net, org, co.kr 을 포함한 도메인 • A-Z, 0-9, - and _ • 이메일주소 • 로그인 아이디 • 큰따옴표로 둘러싸인 문자열 • 달러액수 • 시각 (9:19 am, 12:30 pm) • URL • Dates • Time
정규식이해-1 • Cat, ^Cat, ^Cat$, ^$, ^ • [Ss]mith, gr[ae]y • <H[123456]>, <H[1-6]>, <H[-1-6]> • [0-9A-Z_!.?], [^1-6] • q[^u] • Iraqi Iraqian miqra qasida qintar qoph zaqqum Qantas Iraq • 07[-./]04[-./]76 , 07.04.76 • gra|ey, gr(a|e)y , gr[ea]y • ^From|Subject|Date: , ^(From|Subject|Date): • cat, \<cat, cat\>, \<cat\> • Color|Colour, Colou?r • (July|Jul) (fourth|4th|4) , (July?) (fourth|4(th)?)
정규식이해-2 • \<the the>\, \<the +the\>, \<([A-Za-z]+) +\1\> • 1980.11.11 , /filename\..../ • [ ]*, [ \t]*, [ *| *], [ *|\t*] • \W\w\w\w\w\w\W • \s\D\S\W\s • /^$/ - 빈줄 • /^cat$/ - 한줄에 "cat" 이란 문자만 • [Aa] – “A” 또는 “a” • gr[ae]y - g 다음 r 다음 (a 또는 e) 다음 y • [-0-9] – “-” 또는 숫자 • [\d{1,3}\.]{3}\d{1,3} • \w+\.\w+\@\w+\-?\w+\.[a-z]{2,4}
참고 • 정규 표현식 완전 해부와 실습 - 개정판 • www.regular-expressions.info • JavaScript • VBScript • 여러웹사이트