Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift:字符串中的子字符串(整数/数字)_Swift_String_Int_Substring - Fatal编程技术网

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

Swift:字符串中的子字符串(整数/数字),swift,string,int,substring,Swift,String,Int,Substring,我正在我的应用程序中开发语音识别模块。语音识别器返回一个字符串(可能有一段时间带有垃圾字符串信息,与用户的语音非常匹配),我必须从字符串中评估特定的命令 下面是我得到的一些语音结果字符串示例: “未决案件” “未结案件1234” “开放式案例id 3421” “第9546号未决案件” “未结案件编号5241” “开放式案例9552开放式案例” “开放式案例开放式案例6842” “开箱bla bla 5415 bla” “打开案例1234 bla bla” “未结案件编号54675 bla bl

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

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

  • “未决案件”
  • “未结案件1234”
  • “开放式案例id 3421”
  • “第9546号未决案件”
  • “未结案件编号5241”
  • “开放式案例9552开放式案例”
  • “开放式案例开放式案例6842”
  • “开箱bla bla 5415 bla”
  • “打开案例1234 bla bla”
  • “未结案件编号54675 bla bla 1234 bla”。//命令中应考虑第一个整数
现在,我有一组命令列表,其中一个命令是
opencase

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

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


您可以使用以下内容:

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

我喜欢正则表达式

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

我推荐正则表达式

该模式搜索

  • 字面上的“开箱”
  • 可选的空白字符(
    \\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\\D+(\\d+)"

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

正则表达式模式如何
“open case[0-9]+”
?我正在向您展示一种可能的技术,而不是为您编写代码。需要您再帮我一次,找出与此字符串open bla case bla 62 72 769 bla bla bla匹配的准确正则表达式模式。我试过这一个
open\\D+case\\D+(\\D+)\\s*(\\D+)\\s*(\\D+)
但是如果
space+number
的组合超过3个匹配项,它就会失败。试试
“open\\D+case\\D+([\\D]+\\D)”
,数值搜索会考虑带尾随数字的数字和空格。谢谢。。你太棒了!为什么我不能想到它?如果你还想只考虑一个数字,你必须在关闭的括号(一个或多个)之后用<代码> */Cux>(零或更多)替换<代码> +<代码>。