Scala-基于逻辑添加元素

Scala-基于逻辑添加元素,scala,functional-programming,Scala,Functional Programming,我是斯卡拉的新手。 我有一个接受字符串的函数,基于不同的逻辑,我需要创建一个包含所有排列的字符串序列。 示例-输入字符串为00US\u India0234。结果将是以下各项的Seq: US // Condition - if string contains "US" India // Condition - if string contains "India" 234 // Condition - if string contains number and trim US_India // On

我是斯卡拉的新手。 我有一个接受字符串的函数,基于不同的逻辑,我需要创建一个包含所有排列的字符串序列。 示例-输入字符串为
00US\u India0234
。结果将是以下各项的
Seq

US // Condition - if string contains "US"
India // Condition - if string contains "India"
234 // Condition - if string contains number and trim
US_India // One more condition to keep countries intact and so on
代码尝试到目前为止,我没有工作

val retSeq: Seq[String] = Seq.empty
if myStr contains "US" retSeq +: "US"

我有适当的条件,但无法添加到Seq,我不想创建
var

您可以创建一个元组列表,其中包含谓词和函数,以处理您可能要应用并附加到
Seq
的输入:

val numberRegex = "([0-9]{4,})".r

val predicates = List[(String => Boolean, String => String)](
    (s => s.contains("US"), _  => "US"),
    (s => s.contains("India"), s => s.toUpperCase()),
    (s => numberRegex.findFirstIn(s).nonEmpty, s => numberRegex.findFirstIn(s).head)
 )
def process(s: String): Seq[String] = predicates.collect{
   case (predicate, value) if predicate(s) => value(s)
}

process("00US_India0234") //List(US, 00US_INDIA0234, 0234)
然后您只需要创建一个方法来构建
Seq

val numberRegex = "([0-9]{4,})".r

val predicates = List[(String => Boolean, String => String)](
    (s => s.contains("US"), _  => "US"),
    (s => s.contains("India"), s => s.toUpperCase()),
    (s => numberRegex.findFirstIn(s).nonEmpty, s => numberRegex.findFirstIn(s).head)
 )
def process(s: String): Seq[String] = predicates.collect{
   case (predicate, value) if predicate(s) => value(s)
}

process("00US_India0234") //List(US, 00US_INDIA0234, 0234)

下面是另一个版本,使用
RegEx

import scala.util.matching.Regex

val input = "00US_India0234"

val reg = "([A-Z]{2})_?([A-Za-z]+)([0-9]+)".r

val a = for (m <- reg.findAllMatchIn(input)) yield m.subgroups

println(a.toVector.flatten)

// Out: Vector(US, India, 0234)
import scala.util.matching.Regex
val input=“00US\U India0234”
val reg=“([A-Z]{2})?([A-Za-Z]+)([0-9]+)”

val a=for(m)你能发布一些你尝试过的代码吗?我是新来的,不知道从哪里开始。我不想创建多个Seq你想要这个吗?
输入:00US\u India0234
->
输出:Seq(美国,印度,0234,美国印度)
?是的。这将基于一些条件,并且在不使用mutable的情况下,如果我想调用一个函数而不是const string,该条件会是什么样子?我尝试过(s=>s.contains(“US”),trim(s)),但它不起作用。您可能需要更改列表的类型。您能用示例编辑您的问题吗?这样会容易得多。(s=>s.matches(“.*\\d+.”,“0234”)应该返回数字,而不是硬编码的字符串。我不寻找正则表达式,因为我可能有多个可能无法实现的条件。但感谢您提供另一个选项