#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
 * https://www.debuggex.com/r/KVCh-_jI9bAJOaee
 * 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
}}}

==== 태그안의 문자열 뽑아내기 ====
텍스트
{{{
<PackageName>aaa.dtsx</PackageName>
<PackageName>aaa.txt</PackageName>
<PackageName>aaa.dtsx
<PackageName>aaa.dtsx</aaaPackageName>
<html>aaaa bbb </html>
}}}

정규표현식
{{{
(?<=\<PackageName\>)[\w./]+\.dtsx(?=\<\/PackageName\>)
}}}

결과
{{{
aaa.dtsx
}}}


다른 예제
텍스트
{{{
<Cars>
  <Car id="1234">
     <Make>Volkswagen</Make>
     <Model>Eurovan</Model>
     <Year>2003</Year>
     <Color>White</Color>
  </Car>
  <Car id="5678">
     <Make>Honda</Make>
     <Model>CRV</Model>
     <Year>2009</Year>
     <Color>Black</Color>
     <Mileage>35,600</Mileage>
  </Car>
</Cars>
}}}

정규표현식
{{{
<Car[\n\s\S]*?</Car>
}}}

결과
{{{
<Cars>
  <Car id="1234">
     <Make>Volkswagen</Make>
     <Model>Eurovan</Model>
     <Year>2003</Year>
     <Color>White</Color>
  </Car>
  <Car id="5678">
     <Make>Honda</Make>
     <Model>CRV</Model>
     <Year>2009</Year>
     <Color>Black</Color>
     <Mileage>35,600</Mileage>
  </Car>
}}}
==== 태그안의 속성 뽑아내기 ====
--출처: https://www.javaer101.com/article/4088123.html

텍스트
{{{
<html><img src="kk.gif" alt="text"/></html>
<html><img src='kk.gif' alt="text"/></html>
<html><img src = "kk.gif" alt="text"/></html>
}}}

정규표현식
{{{
<img[^>]+src\s*=\s*['"]([^'"]+)['"][^>]*>
}}}

결과
{{{
<img src="kk.gif" alt="text"/>
<img src='kk.gif' alt="text"/>
<img src = "kk.gif" alt="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 태그만 뽑아내기 ====
{{{
<a href="http://www.aaa.com">aaa.com</a><br><br>환영
}}}

{{{
<[^>]*>
}}}

==== 큰 따옴표 문자열 안의 구분자 제외 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]