정규 표현식

이주형·2022년 11월 1일
0

📌 정규 표현식

특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다.

📌 정규 표현식 문법

  • ^ : 문자열의 시작을 의미.
  • $ : 문자열의 끝을 의미.
  • . : 문자 한 개를 의미. '.'이 위치한 곳에 어떤 문자든지 1개의 문자가 들어감.
  • [] : 대괄호에 있는 문자 중 한 개를 의미. [abc]는 a, b, c 중 하나를 선택.
  • [^] : not의 의미로, 대괄호에서 쓴다면 [^abc] : a, b, c 제외하고 나머지를 의미.
  • | : or을 의미. a|b : a 또는 b.
  • () : 공통되는 부분을 묶을 때, 서브 패턴을 지정할 때 사용. abc|abd -> ab(c|d)로 바꿀 수 있음.
  • ? : 문자가 0회 또는 1회 등장. a? b는 a가 나올 수도, 없을 수도 있음. ab, b.
  • * : 문자가 0회 이상 등장. ab : b, ab, aaab, aaab..
  • +: 문자가 1회 이상 등장. a+b : ab, aab, aaab..
  • {n} : 문자가 n개 나옴. a {2} b : aab
  • {n,} : 문자가 n개 이상 나옴. a {2,} b : aab, aaab, aaaab..
  • {n, m} : 문자가 n개 이상 m개 이하로 나옴. a {1,3 } b : ab, aab, aaab
  • \s : 공백 제거
  • \t : 탭
  • \d : 숫자, [0-9]와 동일
  • \b : 단어의 경계, 문자 사이의 공백
  • \w : 알파벳이나 숫자, [a-zA-Z0-9_]와 동일
  • 위의 \s, \t, \d, \b, \w는 대문자로 바꾸면 반대 의미가 됩니다.

📌 정규 표현식 사용방법

1. Regex 클래스의 생성자 이용

val regex = Regex("[0-9|a-z]")

2. String 클래스의 확장 함수인 toRegex() 이용

val regex ="[0-9|a-z]".toRegex()

3. 삼중 따옴표를 이용

val regex = """\([A-Z]\w+\)""".toRegex() 

matchEntire()

  • 입력값이 정규식과 일치하는지 확인하고 싶을 때 사용하는 함수입니다.
val matchResult : MatchResult? = regex.matchEntire("abcd")

find()

  • 정규식과 일치하는 첫 번째 요소를 찾고 싶을 때 사용하는 함수입니다.
val matchResult : MatchResult? = regex.find("abcd")

findAll()

  • 정규식과 일치하는 모든 요소를 찾고 싶을 때 사용하는 함수입니다.
val matchResult: Sequence<MatchResult> = regex.findAll("abcd")

📌 정규 표현식 활용

1. 인터넷 주소

  • scheme://host인 경우
val path = "https://naver.com"
val regex = "https://(.+)".toRegex()

isMatch(path, regex)

fun isMatch(path: String, regex: Regex) {
    if (path.matches(regex)) println("match")
    else println("not match")
}
  • https뿐 아니라 여러 프로토콜을 사용하는 경우
val path1 = "https://naver.com"
val path2 = "http://daum.net"
val path3 = "ftp://example.com"
val path4 = "telnet://abc.com"

val regex = "(https|http|ftp|telnet)://www\\.(.+)\\.(com|net)".toRegex()
// "https://" + "www" + "." + 문자열 + "." + 문자열의 형식

isMatch(path1, regex)
isMatch(path2, regex)
isMatch(path3, regex)
isMatch(path4, regex)

2. 파일 구조 확인
folder1/folder2/folder3/filename.java 와 같은 구조의 파일을 가져오려면

val regex = "(.+)/(.+)\\.(.+)".toRegex()
   val path = "folder1/folder2/folder3/filename.java"
   
   if (path.matches(regex)){
       println("match!")
       val res = regex.matchEntire(path)
       if (res != null){
       	val (p, n, e) = res.destructured
           println("$p, $n, $e")
       }
   }
   else println("not match..")

3. IP 주소의 뒷자리 바꾸기

  • "\\d+"는 숫자를 1개 이상 사용한 것을 의미하고, "$" 는 문자열의 맨 끝을 의미
// 맨 뒤를 .1로 바꾸기
println( "192.168.0.125".replace("\\.\\d+$".toRegex(), ".1") )
    
// 모든 주소를 .x로 바꾸기
println( "192.168.0.125".replace("\\d+".toRegex(), "x") )

참조
https://keykat7.blogspot.com/2021/07/kotlin.html
https://yoon-dailylife.tistory.com/113

0개의 댓글