dependencies{
// Preferences Data Store
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha07"
implementation "androidx.datastore:datastore-core:1.0.0-alpha07"
// Preferences Data Store를 사용하기 위해선 Coroutine이 필요함
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
}
먼저 DataStore를 사용하기 위한 depenedency 와 코루틴을 사용하기 위한 depenedency 가 필요하다
class MainActivity : AppCompatActivity() {
private val dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
private val stringKey = stringPreferencesKey("textKey")
private val numberKey = intPreferencesKey("numberKey")
안드로이드에서 정규식은 주로 회원가입 같이 입력한 값이 특정한 양식을 따르는지 확인할 때 주로 사용됩니다.
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. 결과 화면
저는 이런식으로 화면을 구성하여 표현했습니다.
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."