我是Scala的新手,想要创建一个函数将Hello123
或Hello 123
拆分成两个字符串,如下:
val string1 = 123
val string2 = Hello
什么是最好的方法来实现这个,我尝试使用正则表达式匹配\\d
和\\D
,但我不确定如何完全编写函数。
问候
根据给定的字符串,我假设您需要匹配一个带有任意数量空格的字符串和数字
这是相应的正则表达式
([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个或多个空格(\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)
- 该检查仅在匹配了可能的空格之后执行一次,并要求数字出现在字符串中当前位置的右侧。
Hello. 123
变成string1 = Hello
和string2 = 123
。 - user6893681"(?<=[a-zA-Z])[.\\s]*+(?=\\d)"
。 - Wiktor Stribiżew