#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
}}}
==== 태그안의 문자열 뽑아내기 ====
텍스트
{{{
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
텍스트
{{{
}}}
정규표현식
{{{
]+src\s*=\s*['"]([^'"]+)['"][^>]*>
}}}
결과
{{{
}}}
==== 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]