我在我的应用中处理语音识别器模块。语音识别器返回一个字符串(可能有一段时间与垃圾字符串信息,与用户的语音紧密匹配),我必须从字符串中评估特定命令。
以下是我得到的一些语音结果字符串示例:
现在,我有一组命令列表,其中一个命令是open case <Integer value>
我可以使用Swift的子字符串实用函数轻松评估单词open case
。但问题是,我必须在关键字open case
之后找出(识别并获取)语音字符串中的整数。
我已经查看了以下答案,但无法找到确切的结果/解决方案:
答案 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