gpt4 book ai didi

ios - Swift 提取正则表达式匹配

转载 作者:行者123 更新时间:2023-11-30 10:35:37 25 4
gpt4 key购买 nike

我想从与正则表达式模式匹配的字符串中提取子字符串。

所以我正在寻找这样的东西:

func matchesForRegexInText(regex: String!, text: String!) -> [String] {
???
}

这就是我所拥有的:

func matchesForRegexInText(regex: String!, text: String!) -> [String] {

var regex = NSRegularExpression(pattern: regex,
options: nil, error: nil)

var results = regex.matchesInString(text,
options: nil, range: NSMakeRange(0, countElements(text)))
as Array<NSTextCheckingResult>

/// ???

return ...
}

问题是 matchesInString给我提供了一系列 NSTextCheckingResult ,其中NSTextCheckingResult.range类型为NSRange

NSRangeRange<String.Index> 不兼容,所以它阻止我使用 text.substringWithRange(...)

知道如何在 swift 中实现这个简单的事情而不需要太多代码行吗?

最佳答案

即使matchesInString()方法需要 String作为第一个参数,它在内部与 NSString 一起工作,并且必须给出范围参数使用NSString长度而不是 Swift 字符串长度。否则会对于“扩展字素簇”(例如“标志”)失败。

Swift 4 (Xcode 9) 起,Swift 标准库提供了在 Range<String.Index> 之间进行转换的函数和NSRange .

func matches(for regex: String, in text: String) -> [String] {

do {
let regex = try NSRegularExpression(pattern: regex)
let results = regex.matches(in: text,
range: NSRange(text.startIndex..., in: text))
return results.map {
String(text[Range($0.range, in: text)!])
}
} catch let error {
print("invalid regex: \(error.localizedDescription)")
return []
}
}

示例:

let string = "🇩🇪€4€9"
let matched = matches(for: "[0-9]", in: string)
print(matched)
// ["4", "9"]

注意:强制解包 Range($0.range, in: text)!是安全的,因为NSRange指给定字符串 text 的子字符串。但是,如果您想避免它,请使用

        return results.flatMap {
Range($0.range, in: text).map { String(text[$0]) }
}

相反。

<小时/>

(Swift 3 及更早版本的旧答案:)

所以你应该将给定的 Swift 字符串转换为 NSString然后提取范围。结果将自动转换为 Swift 字符串数组。

(Swift 1.2的代码可以在编辑历史中找到。)

Swift 2 (Xcode 7.3.1):

func matchesForRegexInText(regex: String, text: String) -> [String] {

do {
let regex = try NSRegularExpression(pattern: regex, options: [])
let nsString = text as NSString
let results = regex.matchesInString(text,
options: [], range: NSMakeRange(0, nsString.length))
return results.map { nsString.substringWithRange($0.range)}
} catch let error as NSError {
print("invalid regex: \(error.localizedDescription)")
return []
}
}

示例:

let string = "🇩🇪€4€9"
let matches = matchesForRegexInText("[0-9]", text: string)
print(matches)
// ["4", "9"]
<小时/>

Swift 3 (Xcode 8)

func matches(for regex: String, in text: String) -> [String] {

do {
let regex = try NSRegularExpression(pattern: regex)
let nsString = text as NSString
let results = regex.matches(in: text, range: NSRange(location: 0, length: nsString.length))
return results.map { nsString.substring(with: $0.range)}
} catch let error {
print("invalid regex: \(error.localizedDescription)")
return []
}
}

示例:

let string = "🇩🇪€4€9"
let matched = matches(for: "[0-9]", in: string)
print(matched)
// ["4", "9"]

关于ios - Swift 提取正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58118433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com