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

时间:2016-09-28 12:24:56

标签: regex string scala

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

val string1 = 123
val string2 = Hello

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

此致

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

您可以替换为前面带有字母且后跟数字的0+空格(\s*+):

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

请参阅online Scala demo

模式详情

  • (?<=[a-zA-Z]) - 如果在字符串中的当前位置之前有ASCII字母,则仅检查(但不使用匹配的文本)的正面后视
  • \\s*+ - 占有率(消耗)零个或多个空格,即
  • (?=\\d) - 此检查仅在空格 - 如果有 - 匹配后执行一次,并且需要在字符串中当前位置之后出现一个数字。