null
null

Reputation: 3517

Checking if a string contains a character in Scala

I have a collection of Strings and I'm checking if they're correctly masked or not.

They're in a map and so I'm iterating over it, pulling out the text value and then checking. I'm trying various different combinations but none of which are giving me the finished result that I need. I have gotten it working by iterating over each character but that feels very java-esque.

My collection is something like: "text"-> "text" "text"-> "**xt" "text"-> "****"

in the first two cases I need to confirm that the value is not all starred out and then add them to another list that can be returned.

Edit My question: I need to check if the value contains anything other an '*', how might I accomplish this in the most efficient scala-esque way?

My attempt at regex also failed giving many false positives and it seems like such a simple task. I'm not sure if regex is the way to go, I also wondered if there was a method I could apply to .contains or use pattern matching

Upvotes: 0

Views: 14482

Answers (4)

Iadams
Iadams

Reputation: 546

Try:

val myStrings = Map("1"-> "text", "2"-> "**xt", "3"-> "****")
val goodStrings = myStrings.filter(_._2.exists(_ !='*'))

This finds all cases where the value in the map contains something other than an asterisk. It will remove all empty and asterisk-only strings. For something this simple, i.e. one check, a regex is overkill: you're just looking for strings that contain any non-asterisk character.

If you only need the values and not the whole map, use:

val goodStrings = myStrings.values.filter(_.exists(_ !='*'))

Upvotes: 1

Keith Pinson
Keith Pinson

Reputation: 1725

Perhaps I misunderstood your question, but if you started with a Map you could try something like:

val myStrings = Map("1"-> "text", "2"-> "**xt", "3"-> "****")
val newStrings = myStrings.filterNot( _._2.contains("*") )

This would give you a Map with just Map(1 -> "text").

Upvotes: 1

Dima
Dima

Reputation: 40510

!string.matches("\\*+") will tell you if the string contains characters other than *.

Upvotes: 3

Ulysse Mizrahi
Ulysse Mizrahi

Reputation: 681

If I understand correctly, you want to find the keys in your map for which the value is not just stars. You can do this with a regex :

val reg = "\\*+".r
yourMap.filter{ case (k,v) => !reg.matches(v) }.keys

If you're not confortable with a regex, you can use a forall statement:

yourMap.filter{ case(k,v) => v.forall(_ == '*') }.keys

Upvotes: 2

Related Questions