๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
TIL

์ •๊ทœ์‹ - Oracle, JAVA

by bamDal 2022. 11. 11.

 

๋Œ€๋ถ€๋ถ„ ์–ธ์–ด์˜ ์ •๊ทœ์‹ ๋ฌธ๋ฒ•์€ ๋น„์Šทํ•˜๋‹ค.

 

์˜ค๋ผํด

์˜ค๋ผํด SQL์—์„œ๋Š” ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•  ๋•Œ REGEXP ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ •๊ทœ์‹ ํ•จ์ˆ˜

 

1) REGEXP_LIKE

: LIKE ๊ฒ€์ƒ‰ ๊ฐ™์ด ์ •๊ทœ์‹ ์ผ์น˜ ์ˆ˜ํ–‰, boolean์„ ๋ฐ˜ํ™˜.

 

REGEXP_LIKE ( ๊ฒ€์ƒ‰๋  ๋ฌธ์ž์—ด, ์ •๊ทœ์‹ ํŒจํ„ด [, ๋งค์นญ ๋งค๊ฐœ๋ณ€์ˆ˜] )

๋”๋ณด๊ธฐ

- ๋งค์นญ ๋งค๊ฐœ๋ณ€์ˆ˜

  • i : ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ X
  • c : ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ (๊ธฐ๋ณธ๊ฐ’)
  • n : ๋งˆ์นจํ‘œ ๋ฌธ์ž๊ฐ€ ์ƒˆ ๋ผ์ธ๊ณผ ์ผ์น˜ํ•˜๋„๋ก ํ•จ
  • m : ์†Œ์Šค ๋ฌธ์ž์—ด์„ ์•ต์ปค ๋ฌธ์ž(^,$) ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ์—ฌ๋Ÿฌ์ค„๋กœ ์ฒ˜๋ฆฌ
  • x : ๊ณต๋ฐฑ ๋ฌธ์ž ๋ฌด์‹œ

 

 

2) REGEXP_SUBSTR

: ์ง€์ •๋œ ์ •๊ทœ์‹ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด ๋ฐ˜ํ™˜

 

REGEXP_SUBSTR( ๋Œ€์ƒ ๋ฌธ์ž์—ด, ์ •๊ทœ์‹ ํŒจํ„ด [, ์‹œ์ž‘์œ„์น˜ [,์ผ์น˜ํšŸ์ˆ˜ [, ๋งค์นญ ํŒŒ๋ผ๋ฏธํ„ฐ] ] ] )

  • ์‹œ์ž‘์œ„์น˜ : ๊ฒ€์ƒ‰ ์‹œ์ž‘ ์œ„์น˜ ์ง€์ • (๊ธฐ๋ณธ๊ฐ’ 1)
  • ์ผ์น˜ํšŸ์ˆ˜ : n๋ฒˆ์งธ ์ผ์น˜๋œ ๋ฌธ์ž์—ด์„ ๋Œ€์ฒด (๊ธฐ๋ณธ๊ฐ’ 0์€ ๋ชจ๋“  ๊ฐ’์„ ๋Œ€์ฒด)
  • REGEXP_SUBSTR(NAME, '[^,]+' , 1, LEVEL)  : NAME์—์„œ ,๋ฅผ ์ œ์™ธํ•œ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ชจ๋“  ๋ฌธ์ž ๋ฐ˜ํ™˜

 

 

3) REGEXP_REPLACE

: ์ •๊ทœ์‹ ํŒจํ„ด์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ํ•ด๋‹น ํ•ญ๋ชฉ์„ ์ง€์ •๋œ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜

 

REGEXP_REPLACE ( ๋Œ€์ƒ ๋ฌธ์ž์—ด, ์ •๊ทœ์‹ ํŒจํ„ด [, ๋Œ€์ฒด ๋ฌธ์ž์—ด [,์‹œ์ž‘์œ„์น˜ [,์ผ์น˜ํšŸ์ˆ˜ [, ๋งค์นญ ๋งค๊ฐœ๋ณ€์ˆ˜] ] ] ] )

  • ์‹œ์ž‘์œ„์น˜ : ๊ฒ€์ƒ‰ ์‹œ์ž‘ ์œ„์น˜ ์ง€์ •( ๊ธฐ๋ณธ๊ฐ’ 1)
  • ์ผ์น˜ํšŸ์ˆ˜ : n๋ฒˆ์งธ ์ผ์น˜๋œ ๋ฌธ์ž์—ด์„ ๋Œ€์ฒด (๊ธฐ๋ณธ๊ฐ’ 0์€ ๋ชจ๋“  ๊ฐ’์„ ๋Œ€์ฒด)
  • ๋งค์นญ ๋งค๊ฐœ๋ณ€์ˆ˜ : ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ฒ€์ƒ‰๋˜๋Š” ์˜ต์…˜ ์„ค์ • ๊ฐ€๋Šฅ

 

 

4) REGEXP_INSTR

: ์ •๊ทœ์‹ ํŒจํ„ด ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰ ํ›„ ์ผ์น˜ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๋ฌธ์ž์—ด์˜ ์œ„์น˜ ๋ฐ˜ํ™˜

REGEXP_INSTR ( ๋Œ€์ƒ ๋ฌธ์ž์—ด, ์ •๊ทœ์‹ ํŒจํ„ด [,์‹œ์ž‘์œ„์น˜ [,์ผ์น˜ํšŸ์ˆ˜ [, ๋ฐ˜ํ™˜ํ•  ๋ฌธ์ž์œ„์น˜ [, ๋งค์นญ ๋งค๊ฐœ๋ณ€์ˆ˜] ] ] ] )

  • ๋ฏธ์ผ์น˜ ์‹œ 0์„ ๋ฐ˜ํ™˜, ์ผ์น˜ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๋ฌธ์ž์—ด์˜ ์œ„์น˜(์ˆซ์ž ๊ฐ’)์„ ๋ฐ˜ํ™˜. (๋งจ ์ฒ˜์Œ ๋ฌธ์ž์˜ ์œ„์น˜๋Š” 1)
  • SREGEXP_INSTR ('The example shows how to use the REGEXP_INSTR function', 'ow', 1, 1, 0, 'i')
  • 'ow'๊ฐ€ ์ฒ˜์Œ ๋‚˜ํƒ€๋‚˜๋Š” ์œ„์น˜๋ฅผ ์ˆซ์ž๋กœ ๋ฐ˜ํ™˜ (๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ณ„ X)

 

 

Java ์ •๊ทœ์‹

 

  • ์ž๋ฐ”์—์„œ ์ •๊ทœํ‘œํ˜„์‹ ์ž‘์„ฑ ์‹œ java.util.regex ํŒจํ‚ค์ง€์˜ ํด๋ž˜์Šค(Pattern, Matcher)๋ฅผ ์‚ฌ์šฉ.

1) Pattern ํด๋ž˜์Šค ์˜ ๋ฉ”์„œ๋“œ

  • compile(String regex)    : regex ๋กœ๋ถ€ํ„ฐ ํŒจํ„ด ์ƒ์„ฑ
  • matches()   : ํŠน์ • ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„ ์ •๊ทœ์‹์— ๋งค์นญ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์†Œ๋“œ
  • matcher(CharSequence input)   : ํ•ด๋‹น ๋ฌธ์ž์—ด์ด ์ •๊ทœ์‹ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ true๋ฅผ ๋ฐ˜ํ™˜
  • asPredicate()    : ๋ฌธ์ž์—ด ์ผ์น˜์— ์‚ฌ์šฉํ•˜๋Š” Predicate ์ž‘์„ฑ
  • pattern()    : ์ปดํŒŒ์ผ๋œ ์ •๊ทœํ‘œํ˜„์‹์„ String ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜
  • split(CharSequence input)   :  ๋ฌธ์ž์—ด์„ ์ฃผ์–ด์ง„ input ์ธ์ž๊ฐ’ ํŒจํ„ด์— ๋”ฐ๋ผ ๋ถ„๋ฆฌ
String pattern = "^[0-9]*$";
String str = "123432";

boolean result = Pattern.matches(pattern, str);
System.out.println(result);

 

 

 

 2) Matcher ํด๋ž˜์Šค

๋ฌธ์ž์—ด์˜ ํŒจํ„ด์„ ํ•ด์„ํ•˜๊ณ  ์ฃผ์–ด์ง„ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ์ฒดํฌํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•จ.

  • Pattern ํด๋ž˜์Šค์™€ Matcher ํด๋ž˜์Šค๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์—†๋‹ค.
  • Matcher ๊ฐ์ฒด๋Š” Pattern ๊ฐ์ฒด์˜ matcher() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์–ป์Œ.

 

  • matches() :  ๋Œ€์ƒ ๋ฌธ์ž์—ด๊ณผ ํŒจํ„ด์ด ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ true ๋ฐ˜ํ™˜
  • find() :  ๋Œ€์ƒ ๋ฌธ์ž์—ด๊ณผ ํŒจํ„ด์ด ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ true๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ทธ ์œ„์น˜๋กœ ์ด๋™
  • find(int start) :   start ์ธ์ž๋กœ ๋ฐ›์€ ์œ„์น˜๋ถ€ํ„ฐ ๋งค์นญ ์ฒดํฌ
  • start() : ๋งค์นญ๋˜๋Š” ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘ ์œ„์น˜ ๋ฐ˜ํ™˜
  • start(int group) : ์ง€์ •๋œ ๊ทธ๋ฃน์ด ๋งค์นญ๋˜๋Š” ์‹œ์ž‘ ์œ„์น˜ ๋ฐ˜ํ™˜
  • end() : ๋งค์นญ๋˜๋Š” ๋ฌธ์ž์—ด์˜ ๋ ๋ฐ”๋กœ ๋‹ค์Œ ์œ„์น˜ ๋ฐ˜ํ™˜
  • group()  : ๋งค์นญ๋œ ๋ถ€๋ถ„ ๋ฐ˜ํ™˜
  • group(int group) : ๋งค์นญ๋œ ๋ถ€๋ถ„ ์ค‘ group๋ฒˆ์งธ ๊ทธ๋ฃจํ•‘ ๋งค์นญ๋ถ€๋ถ„ ๋ฐ˜ํ™˜
  • groupCount()  : ํŒจํ„ด ๋‚ด ๊ทธ๋ฃนํ•‘ํ•œ ์ „์ฒด ๊ฐฏ์ˆ˜ ๋ฐ˜ํ™˜

 

// ์ˆซ์ž
^[0-9]*$

// ํ•œ๊ธ€
^[๊ฐ€-ํžฃ]*$

// ํ•ธ๋“œํฐ๋ฒˆํ˜ธ
010-\d{4}-\d{4}$

// ์ฃผ๋ฏผ๋“ฑ๋ก ๋ฒˆํ˜ธ
\d{6} \- [1-4]\d{6}

 

 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ •๊ทœ์‹ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ํŒจํ„ด์„ ๊ฒ€์‚ฌํ•˜๊ณ , ๋งค์นญ๋˜๋Š” ๋ฌธ์ž์—ด์„ ์ถ”์ถœํ•˜๊ณ  ๋ณ€ํ™˜ํ•œ๋‹ค.

 

๋ฉ”์„œ๋“œ ์˜๋ฏธ
("๋ฌธ์ž์—ด").match(/์ •๊ทœํ‘œํ˜„์‹/flag) "๋ฌธ์ž์—ด"์—์„œ ์ •๊ทœํ‘œํ˜„์‹์— ๋งค์นญ๋˜๋Š” ํ•ญ๋ชฉ๋“ค์„ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
("๋ฌธ์ž์—ด").replace(/์ •๊ทœํ‘œํ˜„์‹/,"๋Œ€์ฒด๋ฌธ์ž์—ด") ์ •๊ทœํ‘œํ˜„์‹์— ๋งค์นญ๋˜๋Š” ํ•ญ๋ชฉ์„ "๋Œ€์ฒด๋ฌธ์ž์—ด"๋กœ ๋ฐ˜ํ™˜
("๋ฌธ์ž์—ด").split(์ •๊ทœํ‘œํ˜„์‹) "๋ฌธ์ž์—ด"์„ ์ •๊ทœํ‘œํ˜„์‹์— ๋งค์นญ๋˜๋Š” ํ•ญ๋ชฉ์œผ๋กœ ์ชผ๊ฐœ์–ด ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
(์ •๊ทœํ‘œํ˜„์‹).test("๋ฌธ์ž์—ด") "๋ฌธ์ž์—ด"์ด ์ •๊ทœํ‘œํ˜„์‹์ด ๋งค์นญ๋˜๋ฉด true, ์•„๋‹ˆ๋ฉด false ๋ฐ˜ํ™˜
(์ •๊ทœํ‘œํ˜„์‹).exec("๋ฌธ์ž์—ด") match๋ฉ”์„œ๋“œ์™€ ์œ ์‚ฌ(๋‹จ, ๋ฌด์กฐ๊ฑด ์ฒซ๋ฒˆ์งธ ๋งค์นญ ๊ฒฐ๊ณผ๋งŒ ๋ฐ˜ํ™˜)

 

// ์ •๊ทœํ‘œํ˜„์‹์„ ๋‹ด์€ ๋ณ€์ˆ˜
cosnt regex = /apple/;

// "๋ฌธ์ž์—ด"์ด "์ •๊ทœํ‘œํ˜„์‹"๊ณผ ๋งค์นญ๋˜๋ฉด true, ์•„๋‹ˆ๋ฉด false ๋ฐ˜ํ™˜
regex.test("Hello banana and apple hahahaha");

// "๋ฌธ์ž์—ด"์—์„œ "์ •๊ทœํ‘œํ˜„์‹"์— ๋งค์นญ๋˜๋Š” ํ•ญ๋ชฉ๋“ค์„ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
const txt = "Hello banana and apple hahahaha");
txt.match(regex);	//['apple']

// "์ •๊ทœํ‘œํ˜„์‹"์— ๋งค์นญ๋˜๋Š” ํ•ญ๋ชฉ์„ "๋Œ€์ฒด๋ฌธ์ž์—ด"๋กœ ๋ฐ˜ํ™˜
txt.replace(regex, "orange"); 	// "Hello banana and orange hahahaha"

 

 

์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ

 

 

ํŒŒ์ด์ฌ

ํŒŒ์ด์ฌ์ด์„œ๋Š” re ๋ชจ๋“ˆ์„ import ํ•ด์„œ ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

import re

// re.compile์„ ํ†ตํ•ด ์ •๊ทœํ‘œํ˜„์‹์„ ์ปดํŒŒ์ผํ•˜์—ฌ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜์—ฌ ์‚ฌ์šฉ
p = re.compile('์ •๊ทœํ‘œํ˜„์‹')

// ๋ฉ”์„œ๋“œ
p = re.compile('[a-z]+')

// ๋ฉ”์„œ๋“œ match : ๋ฌธ์ž์—ด์˜ ์ฒ˜์Œ ์‹œ์ž‘๋ถ€ํ„ฐ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ผ์น˜ํ•˜๋Š” ํŒจํ„ด ์ฐพ๊ธฐ
p.match('aaa')

// ๋ฉ”์„œ๋“œ search : ์ „์ฒด ๋ฌธ์ž์—ด์—์„œ ์ฒ˜์Œ์œผ๋กœ ๋งค์น˜๋˜๋Š” ๋ฌธ์ž์—ด ์ฐพ๊ธฐ
p.search('aaa')

// ๋ฉ”์„œ๋“œ findall : ๋ชจ๋“  ๋งค์น˜๋ฅผ ์ฐพ์•„ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜
p.findall('aaa')

// ๋ฉ”์„œ๋“œ finditer : ๋ชจ๋“  ๋งค์น˜๋ฅผ ์ฐพ์•„ ๋ฐ˜๋ณต๊ฐ€๋Šฅ ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜
p.finditer('a1bb1ccc')
// ๋ฐ˜๋ณต๊ฐ€๋Šฅ ๊ฐ์ฒด 1) 'a' 2) 'bb' 3) 'ccc'

 

๋งค์น˜ ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€ ์ •๋ณด์— ์ ‘๊ทผ๊ฐ€๋Šฅํ•œ ๋„ค ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณต

p = re.compile('[a-z]+')

result = p.search('1aaa11aaa1')

result.group()
// aaa

result.start()
// 1

result.end()
// 4

result.span()
// (1, 4)

 

 ์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ