如果我知道字符串的开始时间和结束时间,如何从字符串中提取数字

how to extract a number from a string if I know when its starting and when its finishing

例如:

我有以下字符串

"somestringthatcanbeanything theStringBeforeTheNumber20.47theStringAfterTheNumber somestringthatcanbeanything"

所以数字总是在

之间
theStringBeforeTheNumber{number}theStringAfterTheNumber

我想要从整个字符串中提取数字,我该怎么做?我正在使用 Scala 我的正则表达式应该是什么样子? val myRgx: Regex = """myRegexGoesHere""".r

您可以使用建议的模式,稍微修改为:

val string = "theStringBeforeTheNumber20.47theStringAfterTheNumber"
val pattern = """theStringBeforeTheNumber(.*?)theStringAfterTheNumber""".r
pattern.findAllIn(string).matchData foreach {
    m => println(m.group(1))
}

括号(.*?)中的数量是一个捕获组,它使用了一个惰性点。这表示匹配第一个字符串和第二个字符串第一次出现之间的所有内容。我们在代码片段中打印出第一个捕获组。

如果您知道开始和结束字符串,我认为最好使用 substring(),因为通常正则表达式的开销很大。 例如 substring(indexOf(theStringBeforeTheNumber) + length(theStringBeforeTheNumber) , indexOf(theStringAfterTheNumber)) 此外,您还必须考虑初始字符串和最终字符串是否相等,因为索引,在这种情况下,您需要进行一些额外的计算。 希望对您有所帮助。

这是使用正则表达式验证提取的数字的另一种方法:

import scala.util.Try

val s = "somestringthatcanbeanything theStringBeforeTheNumber20.47theStringAfterTheNumber somestringthatcanbeanything"

val pattern = """.*?theStringBeforeTheNumber([0-9.-]*)theStringAfterTheNumber.*""".r

val number: Double = s match {
  case pattern(num) => Try(num.toDouble).getOrElse(-999)
  case _ => -999
}
number: Double = 20.47