Swift:字符串中的子串(整数/数字)

时间:2018-05-03 15:11:23

标签: swift string int substring

我在我的应用中处理语音识别器模块。语音识别器返回一个字符串(可能有一段时间与垃圾字符串信息,与用户的语音紧密匹配),我必须从字符串中评估特定命令。

以下是我得到的一些语音结果字符串示例:

  • "打开案例"
  • "打开案例1234"
  • "打开案例ID 3421"
  • "打开案例编号9546"
  • "打开案例编号5241"
  • "打开案例9552打开案例"
  • "打开案例打开案例6842"
  • "打开案例bla bla 5415 bla"
  • "打开案例1234 bla bla"
  • "打开案例编号54675 bla bla 1234 bla" 。 //在命令
  • 中应考虑第一个整数

现在,我有一组命令列表,其中一个命令是open case <Integer value>

我可以使用Swift的子字符串实用函数轻松评估单词open case。但问题是,我必须在关键字open case之后找出(识别并获取)语音字符串中的整数。

我已经查看了以下答案,但无法找到确切的结果/解决方案:

3 个答案:

答案 0 :(得分:7)

我推荐正则表达式。

模式搜索

  • 文字“开放案例”,
  • 可选的空白字符(\\s?
  • 一个或多个数字。 (\\d+)被捕获

代码评估所有示例:

let array = ["open case", "open case 1234", "open case id 3421", "open case no 9546", "open case number 5241", "open case 9552 open case", "open case open case 6842", "open case bla bla 5415 bla", "open case 1234 bla bla", "open case number 54675 bla bla bla"]

func evaluate(string : String) -> String? {
    let pattern = "open case\\s?(\\d+)"
    let regex = try! NSRegularExpression(pattern: pattern) // as the pattern is hard-coded try! is safe
    if let match = regex.firstMatch(in: string, range: NSRange(string.startIndex..., in: string)) {
        let range = Range(match.range(at: 1), in: string)!
        return String(string[range])
    }
    return nil
}

let found = array.compactMap { evaluate(string: $0) } // ["1234", "9552", "6842", "1234"]

如果你想考虑(实际上忽略)open case和整数之间的所有内容,请使用模式

"open case\\D+(\\d+)"

\\D+代表一个或多个非数字字符。

答案 1 :(得分:6)

您可以使用以下内容:

let string = "open case 9552 open case"

if let number = string.components(separatedBy: .whitespaces).compactMap(Int.init).first {
    print(number)
}

如果您使用的是Swift 4.0或更低版本,请使用flatMap代替compactMap

答案 2 :(得分:5)

我喜欢正则表达式。

1.0.5