检查字符串是否包含Scala中的字符

时间:2016-07-04 16:07:10

标签: regex scala pattern-matching

我有一系列字符串,我会检查它们是否被正确屏蔽。

他们在地图中,所以我迭代它,拉出文本值,然后检查。我尝试了各种不同的组合,但没有一个能给我完成我需要的结果。我已经通过迭代每个角色来实现它,但感觉非常简洁。

我的收藏是这样的: "文本" - > "文本" "文本" - > " ** XT" "文本" - > " ****"

在前两种情况下,我需要确认该值未全部加星标,然后将它们添加到另一个可以返回的列表中。

编辑 我的问题:我需要检查值是否包含其他任何内容' *',如何以最有效的scala-esque方式完成此操作?

我对正则表达式的尝试也未能给出许多误报,这似乎是一项如此简单的任务。我不确定正则表达式是否可行,我也想知道是否有一种方法可以应用于.contains或使用模式匹配

4 个答案:

答案 0 :(得分:3)

!string.matches("\\*+")会告诉您字符串是否包含*以外的字符。

答案 1 :(得分:2)

如果我理解正确,您希望在地图中找到值不仅仅是星星的键。您可以使用正则表达式执行此操作:

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

如果您对正则表达式不舒服,可以使用forall语句:

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

答案 2 :(得分:1)

也许我误解了你的问题,但如果你开始使用Map,你可以尝试类似的东西:

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

这会为您提供仅有Map(1 -> "text")的地图。

答案 3 :(得分:1)

尝试:

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

这将查找地图中的值包含星号以外的所有情况。它将删除所有空的和仅星号的字符串。对于这个简单的事情,即一次检查,正则表达式是过度的:你只是在寻找包含任何非星号字符的字符串。

如果您只需要值而不是整个地图,请使用:

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