Ivana
Ivana

Reputation: 17

Count the number of punctuation symbols in a string Kotlin

I have a question how can I count the number of punctuation symbols in a string.

Here is my code snippet

fun punctuationCount(stringValue: Editable): Int {
        val trimmedStr = stringValue.trim()
        return if (trimmedStr.isEmpty()) {
            0
        } else {
           return trimmedStr.split("[a-zA-Z&&[ \t]]".toRegex()).size
        }
    }

Upvotes: 0

Views: 579

Answers (3)

cactustictacs
cactustictacs

Reputation: 19534

Another variation - the Unicode standard defines a bunch of categories (see 4.4) that a character can fall into, and those are present in Kotlin, so you could make use of those if you like

import kotlin.text.CharCategory.*

val punctuation = setOf(
    DASH_PUNCTUATION, START_PUNCTUATION, END_PUNCTUATION,
    CONNECTOR_PUNCTUATION, OTHER_PUNCTUATION
)

val testString = "Some string containing punctuation, like !, @, #, etc."

fun main() {
    testString.count { it.category in punctuation }.run(::println)
}

>>> 8

You'd have to decide if those cover your needs, or which ones to include and exclude (and symbols are a different category class). Just throwing it out there as an option / something to know about!

Upvotes: 1

CryptoFool
CryptoFool

Reputation: 23089

Here's a version of your function that demonstrates what you're asking for:

fun punctuationCount(stringValue: String): Long {
    val trimmedStr = stringValue.trim()
    return if (trimmedStr.isEmpty()) {
        return 0
    } else {
        val exp = Pattern.compile("\\p{Punct}")
        val matcher = exp.matcher(trimmedStr)
        return matcher.results().count()
    }
}

If you don't like the Pattern library's definition of what constitutes punctuation, you can replace the line that computes the Pattern object with something like this that lets you define punctuation characters explicitly:

val exp = Pattern.compile("[!@#\$%.]")

Upvotes: 2

Endzeit
Endzeit

Reputation: 5474

You can make use of the built-in count function on CharSequence to count the occurrence of arbitrary characters.

val testString = "Some string containing punctuation, like !, @, #, etc."
val punctuationChars = setOf('!', '@', '#', '$', '%', '.')

val occurrences = testString.count { char -> char in punctuationChars }

println("I've counted $occurrences occurrences!")

If you need this functionality more often, you might want to extract it into an extension function, e.g.

fun CharSequence.countCharacters(searchedCharacters: Set<Char>): Int =
    this.count { char -> char in searchedCharacters }

val punctuationChars = setOf('!', '@', '#', '$', '%', '.')

fun CharSequence.countPunctuationCharacters(): Int =
    this.countCharacters(punctuationChars)

Then you can do

val occurrences = testString.countPunctuationCharacters()

Thanks to @CryptoFool for the example string.

Upvotes: 3

Related Questions