본문 바로가기
안드로이드 코틀린

[Kotlin][Android] 입력값의 태그 추출하기

by teamnova 2021. 12. 14.
728x90

안녕하세요! 이번 포스트에서는 #으로 시작하는 태그를 추출하는 기능을 만들어보겠습니다.

환경: android sdk 28, viewBinding 사용

 

 

 

먼저 간단한 레이아웃을 만듭니다.

activity_find_tag.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    tools:context=".FindTagActivity">

    <EditText
        android:id="@+id/edt"
        android:layout_width="300dp"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="30dp"
        android:text="태그 추출하기" />

    <TextView
        android:id="@+id/tv"
        android:layout_width="300dp"
        android:layout_height="wrap_content" />

</LinearLayout>

 

 

 

다음으로 텍스트에서 태그를 추출해 태그들을 반환하는 getTags()를 만들어보겠습니다.

스틱코드로 간편하게 메소드를 구현할 수 있습니다.

안드로이드 코틀린 - Stickode

 

스틱코드

 

stickode.com

    private fun getTags(text: String): Sequence<MatchResult> {
 
        val pattern = """#([^#\s]+)""" // 태그 추출 정규식
        val regex = pattern.toRegex()
        val matches = regex.findAll(text)

        return matches
    }

 

 

버튼을 눌렀을 때 태그 추출이 되도록 합니다.

val binding = ActivityFindTagBinding.inflate(layoutInflater)

binding.btn.setOnClickListener {
    val tags = getTags(binding.edt.text.toString())
    var result = ""

    tags.forEach { tag ->
        result += "${tag.value} "
    }

    if (result == "") result = "태그가 없습니다"

    binding.tv.text = result
}

 

 

액티비티의 전체 코드는 다음과 같습니다.

FindTagActivity.kt

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.stickode.databinding.ActivityFindTagBinding

class FindTagActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityFindTagBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.btn.setOnClickListener {
            val tags = getTags(binding.edt.text.toString())
            var result = ""

            tags.forEach { tag ->
                result += "${tag.value} "
            }

            if (result == "") result = "태그가 없습니다"

            binding.tv.text = result
        }
    }


    private fun getTags(text: String): Sequence<MatchResult> {
        /*
        https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/
         */
        val pattern = """#([^#\s]+)""" // 태그 추출 정규식
        val regex = pattern.toRegex()
        val matches = regex.findAll(text)

        return matches
    }
}