我是Scala的新手,想要创建一个函数将Hello123
或Hello 123
拆分为两个字符串,如下所示:
val string1 = 123
val string2 = Hello
最好的方法是什么,我尝试使用正则表达式匹配\\d
和\\D
,但我不确定如何完全编写该函数。
此致
答案 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
模式详情:
(?<=[a-zA-Z])
- 如果在字符串中的当前位置之前有ASCII字母,则仅检查(但不使用匹配的文本)的正面后视\\s*+
- 占有率(消耗)零个或多个空格,即(?=\\d)
- 此检查仅在空格 - 如果有 - 匹配后执行一次,并且需要在字符串中当前位置之后出现一个数字。