代码之家  ›  专栏  ›  技术社区  ›  Krunal

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

  •  0
  • Krunal  · 技术社区  · 8 年前

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

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

    • “打开案例”
    • “打开案例1234”
    • “打开案例id 3421”
    • “未结案件编号9546”
    • “打开案例编号5241”
    • “开箱9552开箱”
    • “开放式案例开放式案例6842”
    • “开箱bla bla 5415 bla”
    • “打开案例1234 bla bla”
    • “打开案例编号54675 bla bla 1234 bla”。//命令中应考虑第一个整数

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

    我可以很容易地评价这个词 open case 使用Swift的子字符串实用程序函数。但问题是,我必须从关键字后面的语音字符串中找出(识别并获取)一个整数 开放性病例

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

    3 回复  |  直到 8 年前
        1
  •  6
  •   vadian    8 年前

    我建议使用正则表达式。

    模式将搜索

    • 文字“开箱”,
    • 可选空白字符( \\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+ 表示一个或多个非数字字符。

        2
  •  5
  •   Mukesh    8 年前

    您可以使用以下内容:

    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

        3
  •  5
  •   matt    8 年前

    我喜欢regex。

    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")
    }