我有一系列字符串,我会检查它们是否被正确屏蔽。
他们在地图中,所以我迭代它,拉出文本值,然后检查。我尝试了各种不同的组合,但没有一个能给我完成我需要的结果。我已经通过迭代每个角色来实现它,但感觉非常简洁。
我的收藏是这样的: "文本" - > "文本" "文本" - > " ** XT" "文本" - > " ****"
在前两种情况下,我需要确认该值未全部加星标,然后将它们添加到另一个可以返回的列表中。
编辑 我的问题:我需要检查值是否包含其他任何内容' *',如何以最有效的scala-esque方式完成此操作?
我对正则表达式的尝试也未能给出许多误报,这似乎是一项如此简单的任务。我不确定正则表达式是否可行,我也想知道是否有一种方法可以应用于.contains或使用模式匹配
答案 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(_ !='*'))