#title Regular Expressions [[TableOfContents]] windows7 환경이다. [http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788979147742&orderClick=LAG&Kc= 한 권으로 끝내는 정규표현식, 잰 고이바에르츠/스티븐 리바이선] 을 정리해 본다. .Net을 기준으로 한다. https://regex101.com/library?orderBy=MOST_POINTS&page=2&search=&filterFlavors=dotnet test * http://regexstorm.net/tester --> .Net * https://regexr.com/ * https://regex101.com/ ==== T-SQL 주석 ==== --참고: https://www.regextester.com/94246 https://regexr.com/4cgnu {{{ --[^\r\n]*|/\*[\s\S]*?\*\/ (\/\*([^*]|[\r\n]|(\*+([^\*\/]|[\r\n])))*\*+\/)|(\/\/.*)|(\-\-(.*)[\r\n])|((.*)\*\/) }}} {{{ create function dbo.remove_comment(@definition nvarchar(max)) returns nvarchar(max) begin declare @start int = 0 , @next_start int , @end int while(1=1) begin set @end = charindex('*/', @definition) if @end = 0 break set @start = 0 while(1=1) begin set @start = charindex('/*', @definition, @start+1) set @next_start = charindex('/*', @definition, @start+1) if @next_start > @end or @next_start = 0 break end set @definition = stuff(@definition, @start, @end-@start+2, '') --select @definition --print concat('@start=', @start, ', @end=', @end) if @start = 0 break end return dw.dbo.rxreplace(@definition, '--[^\r\n]*', '', 1) end }}} ==== 따옴표 사이의 값 뽑아내기 ==== 텍스트 {{{ "aaa"bbb ccc ddd"fff" }}} 정규표현식 {{{ (?<=\")(.*?)(?=\") }}} 결과 {{{ aaa fff }}} ==== 태그안의 문자열 뽑아내기 ==== 텍스트 {{{ aaa.dtsx aaa.txt aaa.dtsx aaa.dtsx aaaa bbb }}} 정규표현식 {{{ (?<=\)[\w./]+\.dtsx(?=\<\/PackageName\>) }}} 결과 {{{ aaa.dtsx }}} 다른 예제 텍스트 {{{ Volkswagen Eurovan 2003 White Honda CRV 2009 Black 35,600 }}} 정규표현식 {{{ }}} 결과 {{{ Volkswagen Eurovan 2003 White Honda CRV 2009 Black 35,600 }}} ==== 태그안의 속성 뽑아내기 ==== --출처: https://www.javaer101.com/article/4088123.html 텍스트 {{{ text text text }}} 정규표현식 {{{ ]+src\s*=\s*['"]([^'"]+)['"][^>]*> }}} 결과 {{{ text text text }}} ==== SQL 스크립트에서 insert 되는 테이블 찾기 ==== text {{{ insert into [dw].[fact].[conn_users] insert into [Fact].conn_users insert into Fact.conn_users insert into fact.conn_users insert into dw.fact.conn_users insert into [dw].fact.[conn_users] insert into [dw].fact.[Conn users] insert into fact.conn_users insert fact.conn_users(cola, colb) update fact.conn_users insert dim.code(cola, colb) }}} 정규표현식 이건 닷넷에서 잘 안먹히네.. {{{ (?<=insert(\s+into\s+|\s+))((\[|)\w+(\]|)|(\[|)\w+(\]|)|)(\.|)(\[|)(?i)fact(\]|)\.(\w+|\[[^\]]*]) }}} {{{ (?<=insert(\s+into\s+|\s+))(\[\w+\]\.|\w+\.|)(\[|)(?i)(temp|fact|dim|etl|realtime|bill|dbo)(\]|)\.(\w+|\[[^\]]*]) }}} 결과 {{{ [dw].[fact].[conn_users] [Fact].conn_users Fact.conn_users fact.conn_users dw.fact.conn_users [dw].fact.[conn_users] [dw].fact.[Conn users] fact.conn_users fact.conn_users }}} ==== 스키마.테이블 패턴 ==== {{{ select * from dw.fact.tablex a inner join Dim.tabley b on a.id = b.id inner join [fact].tablec c on a.id = c.id select * from dw.etl.tablex a inner join realtime.tabley b on a.id = b.id inner join dbo.tablec c on a.id = c.id inner join bill.tablec d on a.id = d.id }}} {{{ (\w+\.|)(\[|)(?i)(fact|dim|etl|realtime|bill|dbo)(\]|)\.\w+ }}} 결과 {{{ dw.fact.tablex Dim.tabley [fact].tablec dw.etl.tablex realtime.tabley dbo.tablec bill.tablec }}} 다른 예제 텍스트 {{{ insert into [dw].[fact].[conn_users] insert into [Fact].conn_users insert into Fact.conn_users insert into fact.conn_users insert into dw.fact.conn_users insert into [dw].fact.[conn_users] insert into [dw].fact.[conn users] insert into fact.conn_users insert fact.conn_users(cola, colb) update fact.conn_users insert dim.code(cola, colb) }}} 정규표현식 {{{ (\[\w+\]\.|\w+\.|)(\[|)(?i)(temp|fact|dim|etl|realtime|bill|dbo)(\]|)\.(\w+|\[[^\]]*]) }}} 결과 {{{ dw.fact.aaaa dw.[fact].aaaa fact.aaaa fact.[aaaa] Fact.AAAA [fact].[aaaa bbb] dw.[fact].[aaaa bbb] [dw].[fact].[aaaa bbb] }}} ==== 특정 문자열만 뽑아내기 ==== {{{ abc2 abc abc first_abc abc_level }}} {{{ (\s|)\babc\b }}} 결과 {{{ abc abc }}} ==== html 태그만 뽑아내기 ==== {{{ aaa.com

환영 }}} {{{ <[^>]*> }}} ==== 큰 따옴표 문자열 안의 구분자 제외 csv ==== {{{ a,"bcd, efg",h,i }}} {{{ (?=(?:[^"]|"[^"]*")*$) }}} 아래와 같이 구분(split)할 수 있음 * a * "bcd, efg" * h * i ==== 배열(array) 패턴 ==== expression {{{ \[\d*(?:,\s*\d+)*\] }}} text {{{ Name=이재학, Skill=[1, 2,3] }}} 결과 {{{ [1, 2,3] }}} ==== 메타문자 ==== {{{ $()*+.?[\^{| }}} escape 문자 {{{ text <- "abcd $efg hig" pattern <- "\\$efg" unlist(regmatches(text, regexec(pattern, text))) }}} {{{ > unlist(regmatches(text, regexec(pattern, text))) [1] "$efg" }}} 종료대괄호(]), 하이픈(-), 종료중괄호(})는 메타 문자에 빠져있다. 종료대괄호(]), 하이픈(-)은 이스케이프 처리되지 않은 시작대괄호([) 뒤에 올 경우에만 메타 문자로 인식되며, 종료중괄호(})는 이스케프 처리되지 않은 시작중괄호({) 뒤에 올 경우에만 메타문자로 인식된다. 종료 괄호 ),},]는 이스케이프 처리할 일이 없어 메타문자로 분류되지 않는다. ==== 기본 매칭 ==== 문자열에서 특정 단어가 있는지 {{{ text <- "abcd efg hig" pattern <- "efg" unlist(regmatches(text, regexec(pattern, text))) }}} {{{ > unlist(regmatches(text, regexec(pattern, text))) [1] "efg" }}} ==== 참고 ==== * [https://blog.hexabrain.net/197?category=472743] 정규표현식 강좌 * [https://medium.com/@chrisjune_13837/%EC%A0%95%EA%B7%9C%EC%8B%9D-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-%EC%98%88%EC%A0%9C%EB%A5%BC-%ED%86%B5%ED%95%9C-cheatsheet-%EB%B2%88%EC%97%AD-61c3099cdca8 핵심만 모아놓은 Cheat Sheet]