Scala:字符串模式匹配和分割

4

我是Scala的新手,想要创建一个函数将Hello123Hello 123拆分成两个字符串,如下:

val string1 = 123
val string2 = Hello

什么是最好的方法来实现这个,我尝试使用正则表达式匹配\\d\\D,但我不确定如何完全编写函数。

问候

2个回答

0

根据给定的字符串,我假设您需要匹配一个带有任意数量空格的字符串和数字

这是相应的正则表达式

([a-zA-Z]+)\\s*(\\d+)

现在使用.r创建一个正则表达式对象

"([a-zA-Z]+)\\s*(\\d+)".r

Scala REPL

scala> val regex = "([a-zA-Z]+)\\s*(\\d+)".r

scala> val regex(a, b) = "hello 123"
a: String = "hello"
b: String = "123"

scala> val regex(a, b) = "hello123"
a: String = "hello"
b: String = "123"

安全处理模式匹配的函数

使用提取器进行模式匹配

str match {
  case regex(a, b) => Some(a -> b.toInt) 
  case _ => None 
}

这是一个执行正则表达式和模式匹配的函数。
def matchStr(str: String): Option[(String, Int)] = {
  val regex = "([a-zA-Z]+)\\s*(\\d+)".r
  str match { 
    case regex(a, b) => Some(a -> b.toInt) 
    case _ => None 
  }
}

Scala REPL

scala> def matchStr(str: String): Option[(String, Int)] = {
    val regex = "([a-zA-Z]+)\\s*(\\d+)".r
    str match {
      case regex(a, b) => Some(a -> b.toInt)
      case _ => None
    }
  }
defined function matchStr

scala> matchStr("Hello123")
res41: Option[(String, Int)] = Some(("Hello", 123))

scala> matchStr("Hello 123")
res42: Option[(String, Int)] = Some(("Hello", 123))

0

您可以将前面是字母且后面是数字的0个或多个空格(\s*+)替换为:

var str = "Hello123"
val res = str.split("(?<=[a-zA-Z])\\s*+(?=\\d)")
println(res.deep.mkString(", "))  // => Hello, 123

请查看在线Scala演示

模式详细信息

  • (?<=[a-zA-Z]) - 一个正向后行断言,只检查(但不消耗匹配的文本)当前位置之前是否有一个ASCII字母。
  • \s*+ - 占有性地匹配(消耗)零个或多个空格,即
  • (?=\d) - 该检查仅在匹配了可能的空格之后执行一次,并要求数字出现在字符串中当前位置的右侧。

嗨,Wiktor,我能知道如何跳过句号吗?例如:Hello. 123 变成 string1 = Hellostring2 = 123 - user6893681
你应该将它作为消费模式的一部分:"(?<=[a-zA-Z])[.\\s]*+(?=\\d)" - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接