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

如何在swift中获取特定字符前后的特定字符串?

  •  0
  • sarah  · 技术社区  · 6 年前

    我有这根绳子: "lat/lng: (-6.2222391,106.7035684)"

    我只需要把那些双数据类型输入 string . 那么如何只得到-6.222239*1和 一百零六点七零三五六八四 作为字符串变量?

    如何得到括号中的数字?

    所以我想我在后面有绳子 "(" 以前 "," 得到 "-6.2222391" 并且之后 “,” 以前 ")" 得到 "106.7035684"

    但我不知道怎么用密码

    4 回复  |  直到 6 年前
        1
  •  1
  •   Kathiresan Murugan    6 年前
    let source = "lat/lng: (-6.2222391,106.7035684)"
    let splited = source.components(separatedBy: "lat/lng: ")[1] //separating
    
    let removed = splited.replacingOccurrences(of: "(", with: "").replacingOccurrences(of: ")", with: "") // removing
    
    let coord = removed.components(separatedBy: ",") // removing
    
    let lat = Double(coord[0])
    let lng = Double(coord[1])
    
        2
  •  1
  •   ielyamani    6 年前

    您可以使用regex:

    let str = "lat/lng: (-6.2222391,106.7035684)"
    let rg = NSRange(location: 0, length: (str as NSString).length)
    
    let latRegex = try! NSRegularExpression(pattern: "(?<=\\()[+-\\.0-9]+(?=,)")
    
    • (?<=\\() 积极的展望 ,它查找前面的任何内容 ( ,
    • [+-\\.0-9]+ 热切地寻找至少一个或多个字符 + , - , . ,或来自的数字 0 9 ,
    • (?=,) 积极的展望 ,它匹配后面的任何内容 , .

    现在让我们使用这个正则表达式:

    let latitude: Double?  = latRegex.matches(in: str, range: rg)
        .compactMap { Double(str[Range($0.range, in: str)!]) }
        .first
    
    if let lat = latitude {
        print(lat)  //-6.2222391
    }
    

    同样,我们可以得到经度:

    let longRegex = try! NSRegularExpression(pattern: "(?<=,)[+-\\.0-9]+(?=\\))")
    let longitude: Double?  = longRegex.matches(in: str, range: rg)
        .compactMap { Double(str[Range($0.range, in: str)!]) }
        .first
    
    if let long = longitude {
        print(long)  //106.7035684
    }
    

    附言:为了简洁起见,我在这里和那里都使用了强制拆解。

        3
  •  0
  •   nayem    6 年前

    你已经得到了一些很好的答案。但我想我已经想出了一个更紧凑的版本。

    你需要关心 - 0~9 . ,

    这个 , 仅考虑两种成分,然后用于分离。

    看到这个:

    let source = "lat/lng: (-6.2222391,106.7035684)"
    let allowedCharactersString = "-01234567890.,"
    let latLongValues = String(source.characters.filter { 
                                allowedCharactersString.characters.contains($0) 
                              }).components(separatedBy: ",")
    print(latLongValues.first!) // "-6.2222391"
    print(latLongValues.last!) // "106.7035684"
    
        4
  •  0
  •   Bhadresh Kathiriya    6 年前

    试试这个:

    let source = "lat/lng: (-6.2222391,106.7035684)".components(separatedBy: ")")[0]
    let removed = source.components(separatedBy: "(")[1];// removing
    
    //OR
    //let source = "lat/lng: (-6.2222391,106.7035684)".components(separatedBy: "(")[1]
    //let removed = source.components(separatedBy: ")")[0];// removing
    
    
    let coord = removed.components(separatedBy: ",") // removing
    
    let lat = Double(coord[0])
    let lng = Double(coord[1])