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

Kru*_*nal 1 string int substring swift

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

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

  • "开放情况"
  • "打开案例1234"
  • "open case id 3421"
  • "打开案例没有9546"
  • "打开案号5241"
  • "开箱9552开箱"
  • "打开案例打开案例6842"
  • "open case bla bla 5415 bla"
  • "打开案例1234 bla bla"
  • "打开案例编号54675 bla bla 1234 bla".//应该在命令中考虑第一个整数

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

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

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

vad*_*ian 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"]
Run Code Online (Sandbox Code Playgroud)

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

"open case\\D+(\\d+)"
Run Code Online (Sandbox Code Playgroud)

\\D+ 表示一个或多个非数字字符.


Muk*_*esh 6

您可以使用以下内容:

let string = "open case 9552 open case"

if let number = string.components(separatedBy: .whitespaces).compactMap(Int.init).first {
    print(number)
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Swift 4.0或更低版本flatMap而不是使用compactMap.


mat*_*att 5

我喜欢正则表达式.

let input = "open case 1234 bla bla"
let pattern = "open case ([0-9]+)"
do {
    let regex = try NSRegularExpression(pattern: pattern, options: .caseInsensitive)
    let matches = regex.matches(in: input, options: [], range: NSRange(location: 0, length: input.utf16.count))
    if matches.count > 0 {
        let match = matches[0]
        let r = match.range(at: 1)
        let num = input.substring(with: Range(r, in: input)!)
        // "1234"
    }
} catch {
    print("illegal regex")
}
Run Code Online (Sandbox Code Playgroud)