코틀린 안드로이드 정규식(Regex) 활용하기 -기본부터 심화

반응형
728x170

안드로이드에서 정규식은 주로 회원가입 같이 입력한 값이 특정한 양식을 따르는지 확인할 때 주로 사용됩니다.

 


1. 기본 개념 및 양식

 

^ : 문자열의 시작을 의미.
$ : 문자열의 끝을 의미.
 . : 문자 한 개를 의미. '.'이 위치한 곳에 어떤 문자든지 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회 이상 등장. a*b : 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는 대문자로 바꾸면 반대 의미가 됩니다. 

300x250

2. 사용 방법

 

정규식을 만드는 방법에는 여러가지 방법이 있지만

대표적인거 1개만 가르쳐드리겠습니다.

 

정규식 정의 방법

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

위와 같이 Regex 안에 정규식을 정의할 수 있습니다.

 

 

정규식을 사용해서 문자열 확인

 

아래의 코드는 Activity의 onCreate() 안에 정의했습니다.

// 웹 표준 형식 확인
val regexWeb = Regex("https://(.+)")
// 숫자만 있는지 확인
val regexOnlyNumber = Regex("-?\\d+(\\.\\d+)?")
// 파일 디렉토리인지 확인
val regexFileDirectory = Regex("(.+)/(.+)\\.(.+)")
// 숫자만 확인
val regexPickNumber = Regex("[^0-9]")

// 입력한 값이 https 웹 형식을 따르는지
binding.isHttpsWeb.setOnClickListener {
    if (isRegexRight(binding.editText.text.toString(), regexWeb)) {
        makeToast("알맞은 https 형식입니다.")
    } else {
        makeToast("틀린 https 형식입니다.")
    }
}

// 입력한 값에 숫자만 들어있는지 확인
binding.isOnlyNumber.setOnClickListener {
    if (isRegexRight(binding.editText.text.toString(), regexOnlyNumber)) {
        makeToast("숫자만 존재")
    } else {
        makeToast("문자 존재함")
    }
}

// 입력한 값이 파일 위치를 가리키는지 확인
binding.isFileDirectory.setOnClickListener {
    if (isRegexRight(binding.editText.text.toString(), regexFileDirectory)) {
        makeToast("올바른 파일 디렉토리")
    } else {
        makeToast("틀린 파일 디렉토리")
    }
}

// 입력한 값에서 숫자만 뽑아서 다시 반환하기
binding.pickOnlyNumbers.setOnClickListener {
    binding.textView.text =
        onlyRemainsCertainChar(binding.editText.text.toString(), regexPickNumber)
}

// 해당 정규식이 맞는지 아닌지 확인
private fun isRegexRight(text: String, regex: Regex): Boolean {
return text.matches(regex)
}

// 해당 정규식에 맞는 값을 제외하고는 전부 삭제하기
private fun onlyRemainsCertainChar(text: String, regex: Regex): String {
return text.replace(regex, "")
}

3. 주로 사용되는 정규식 모음

 

자주 사용될거로 예상되는 정규식만 따로 모아서 정의해봤습니다.

// 웹 표준 형식 확인
val regexWeb = Regex("https://(.+)")
// 숫자만 있는지 확인
val regexOnlyNumber = Regex("-?\\d+(\\.\\d+)?")
// 파일 디렉토리인지 확인
val regexFileDirectory = Regex("(.+)/(.+)\\.(.+)")
// 숫자만 확인
val regexPickNumber = Regex("[^0-9]")
// 이메일 양식인지 확인
val regexEmail = Regex("^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$")
// 전화번호 양식인지 확인
val regexPhoneNumber = Regex("^\\d{2,3} - \\d{3,4} - \\d{4}\$")
// 숫자와 문자 포함 형태의 6 ~ 20글자의 간단한 비밀번호
val regexSimplePassword = Regex("^[A-Za-z0-9]{6,20}\$")
// 숫자와 문자 포함 형태의 6글자 이상의 간단한 비밀번호
val regexSimplePassword2 = Regex("^[A-Za-z0-9]{6}\$")
// 특수문자, 문자, 숫자를 포함한 6 ~ 20글자의 복잡한 비밀번호
val regexComplexPassword = Regex("^.*(?=^.{8,15}\$)(?=.*\\d)(?=.*[a-zA-Z])(?=.*[!@#\$%^&+=]).*\$")

4. 결과 화면

 

저는 이런식으로 화면을 구성하여 표현했습니다.

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

반응형

댓글()

JISULIFE-휴대용 목 선풍기 리뷰 후기 - 내돈내산

IT 관련 지식|2022. 7. 17. 09:31
반응형
728x170

여름 세일 때 산 알리발 목 선풍기 리뷰

 

< JISULIFE-휴대용 목 선풍기 >

[상품 링크]


1. 디자인

디자인은 전반적으로 예쁘다고 생각합니다.

실물 디자인

 

단지 한 가지 단점이 있다면 접을 수 있는 기능이 없기 때문에 휴대성이 조금 떨어진다는거?

 

그 이외에는 예쁘고 만족스러운 디자인이라고 생각됩니다.

 


2. 기능적 설명

 

1) 360도 전방위 바람

 

이라고 설명은 되어있지만

 

실제로는 

 

거의 이 부분 (앞부분)에서만 바람이 나옵니다 

 

목 앞부분에서만 대부분의 바람이 나옴

목 부분에도 구멍이 있긴 하지만 그쪽에서 나오는 건 전체 바람의 10% 정도...?

 

 

2) 3단계 조절 

 

한 번 클릭으로 1단계 -> 두 번째 클릭으로 2단계 -> 세 번째 클릭으로 3단계 -> 네 번째 클릭으로 끄기

 

오랫동안 누르기를 통해 바로 끌 수 있습니다. (이 부분은 좋네요!)

 

 

3) 배터리

 

배터리는 4000mAh라서 생각보다 오래갑니다

 

메이커 공식 16시간!

 

아마 주로 출퇴근이나 사무실에서 잠깐 사용할 건데 그런 면에서는 충분한 용량이라 생각됩니다.

 

참고로 충전 시간은 3~4시간입니다.

 

4) 소음

300x250

소음은 역시 팬이다 보니 생각보다 있습니다.

 

조용한 환경(도서관 정도) + 바로 옆이면 1단계만 하더라도 소음이 느껴집니다.

 

조용한 환경 + 1단계에서 소음이 안 느껴질 정도라면 3m는 떨어져 있어야 거의 안 느껴집니다.

 

하지만 제가 들고 있는 선풍기들(집에 4개 정도 있음;;)은 다 비교한 결과 

 

전부다 1단계에서는 이 정도 이상의 소음이 발생했기 때문에

 

특별히 이 선풍기가 소음이 더 크다! 이런 건 아니라고 생각합니다.

 

어떤 선풍기를 쓰더라도 이 정도 소음은 어쩔수없다랄까...?


3. 장단점

 

<장점>

1. 긴 배터리 타임으로 하루 종일 사용 가능(1단계로 사용 시 16시간 사용 가능)

 

2. 생각보다 예쁨

 

3. KC 마크를 받았기 때문에 어느정도 안심하고 사용가능

 

 

<단점>

1. 바람이 나오는 구멍은 뒤에도 있는데 뒤쪽은 거의 나오지 않음 ㅠ (이 부분이 제일 슬픈 듯)

 

2. 다른 목 선풍기에 비해 조금 무거운 편임(258g) (대신 배터리가 큼 ㅎ)

 

3. 배터리 잔량을 표시해주는 기능이 없음

 

 

저는 전반적으로 만족하는 중입니다.

 

일단 목에 상당히 안정적으로 얹어져 있기 때문에 가방을 메고 사용해도

 

떨어지거나 거슬리는 부분이 전혀 없고

 

단지, 목 부분에만 바람이 좀 더 갔으면 정말 완벽한 제품이었을거 같네요 ㅠ

 

PS. 찾아보니까 목쪽에도 팬 달린 (그러니까 좌,우,목) 제품도 있네요... 아마 이 제품은 목 뒤쪽에도 바람이 갈거 같습니다

 

대신 조금 비쌈 ㅠ

 

혹시 모르니 해당 제품의 링크도 남겨 놓겠습니다.

 

목 쪽에도 팬 달린 목 선풍기

 

41388.0₩ 55% OFF|JISULFE 휴대용 날개 없는 전기 충전식 목선풍기, 목 받침대 디자인 4 단계 속도 조절

Smarter Shopping, Better Living! Aliexpress.com

ko.aliexpress.com

 

 

싼거도 있었음.... ㅠㅠㅠㅠ

 

팬 4개인 목 선풍기

 

9281.0₩ 69% OFF|휴대용 미니 목 팬 휴대용 Bladeless 팬 USB 충전식 Leafless 교수형 팬 공기 냉각기 냉각

Smarter Shopping, Better Living! Aliexpress.com

ko.aliexpress.com

 

근데 이런건 보통 싼건 싼 이유가 있기 때문에 어느정도 값되는걸 써야....


4. 추가 후기

 

한 2주간 출퇴근할 때 매일 써봤습니다.

 

목부분과 얼굴에만 바람이 와서 그닥 시원하지 않을거라 생각했는데

 

생각보다는 훨씬 좋았습니다.

 

사람이 목과 얼굴만 시원해도 더움을 느끼는 것이 상당히 줄어들더라고요 ㅎㅎ

 

솔직히 밖에서 사용하면 그렇게 큰 효과가 없지만

 

에어컨이 작동하는 대중교통이나 실내에서 사용하면 상당히 큰 효과가 있습니다.

 

이제는 친구보러 갈 때 아니면 왠만하면 이거 들고 나가게되네요;;

 

단지 이어폰을 쓰고 이거 사용하시는 분들은 꼭 노캔이 달린 이어폰을 쓰서야할거 같습니다...

 

아니면 바람 소리 때문에 거의 안들리게 되거든요...

반응형

댓글()

안드로이드 코틀린 숫자 돈 단위, 콤마 표시 DecimalFormat

IT 관련 지식|2022. 7. 3. 09:31
반응형
728x170

코틀린에서 숫자에 포맷을 넣어서 표현하는 방법을 알아보겠습니다.


1. 소스코드

DecimalFormat을 사용하여 숫자에 대한 포맷을 정의할 수 있습니다.

import java.text.DecimalFormat

//===== [코틀린 메인 시작 부분] ===== 
fun main(args : Array<String>) {
	
	/*
	[설 명]	
	1. DecimalFormat : 코틀린에서 숫자의 Format을 변경할 수 있습니다
	2. # : 10진수 표시로 빈자리를 채우지 않습니다
 	3. 0 : 10진수 표시로 빈자리를 0으로 채웁니다
	4. 필수 import 패키지 : import java.text.DecimalFormat 
	*/	
	
	println("[DecimalFormat 사용해 화폐 돈 단위 콤마 표시 실시 - 숫자 포맷 변경]")
	
	//int 변수 선언 실시
	var int_money = 1000000
	println("원본 : "+int_money)
	
	//DecimalFormat 객체 선언 실시 (소수점 표시 안함)
	val t_dec_up = DecimalFormat("#,###")
	var str_change_money_up = t_dec_up.format(int_money)
	println("화폐 표시 : "+str_change_money_up)
	
	//DecimalFormat 객체 선언 실시 (소수점 표시)
	val t_dec_down = DecimalFormat("#,###.00")
	var str_change_money_down = t_dec_down.format(int_money)
	println("화폐 표시 (소수점) : "+str_change_money_down)
	
}

DecimalFormat

 

[요약 설명]

1. DecimalFormat : 코틀린에서 숫자의 Format을 변경할 수 있습니다

2. # : 10진수 표시로 빈자리를 채우지 않습니다

3. 0 : 10진수 표시로 빈자리를 0으로 채웁니다

4. 필수 import 패키지 : import java.text.DecimalFormat

300x250

2. 실행 결과

반응형

댓글()

안드로이드 Out of memory. Java heap space 에러 해결 방법!

IT 관련 지식|2022. 7. 2. 08:09
반응형
728x170

주로 안드로이드 스튜디오에서 프로젝트를 rebuild할 때 발생하는 에러입니다.

 

아래와 같은 에러가 발생하는데요

 

Out of memory. Java heap space

해결 방법은 간단합니다.

 

안드로이드 스튜디오에서

file -> invalidate caches -> Invalidate and Restart 버튼 클릭

 

위 그림과 같이 클릭 하면 안드로이드 스튜디오가 재시작됩니다.

 

그리고나서 다시 rebuild를 해보면 정상적으로 되는 것을 확인할 수 있습니다.

300x250

 

반응형

댓글()