gpt4 book ai didi

ios - swift 中带有 NSRegularExpressions 的可选捕获组

转载 作者:行者123 更新时间:2023-11-28 11:00:16 24 4
gpt4 key购买 nike

我想要有多个可选的捕获组,我想访问它们对应的字符串。

看起来/像这样工作的东西:

let text1 = "something with foo and bar"
let text2 = "something with just bar"
let regex = NSRegularExpression(pattern: "(foo)? (bar)")

for (first?, second) in regex.matches(in:text1) {
print(first) // foo
print(second) // bar
}

for (first?, second) in regex.matches(in:text2) {
print(first) // nil
print(second) // bar
}

最佳答案

使用 NSRegularExpression 检索捕获的子文本并不是那么容易。

首先,matches(in:range:)的结果是[NSTextCheckingResult],每一个NSTextCheckingResult都不匹配到像 (first?, second) 这样的元组。

如果您想检索捕获的潜台词,您需要使用 rangeAt(_:) 方法从 NSTextCheckingResult 获取范围。 rangeAt(0) 表示匹配整个模式的范围,rangeAt(1) 用于第一次捕获,rangeAt(2) 用于第二次,等等。

rangeAt(_:) 返回一个 NSRange,而不是 Swift Range。内容(locationlength)基于 NSString 的 UTF-16 表示。

这是对您的目的最重要的部分,rangeAt(_:) 为每个丢失的捕获返回 NSRange(location: NSNotFound, length: 0)

所以,你可能需要这样写:

let text1 = "something with foo and bar"
let text2 = "something with just bar"
let regex = try! NSRegularExpression(pattern: "(?:(foo).*)?(bar)") //please find a better example...

for match in regex.matches(in: text1, range: NSRange(0..<text1.utf16.count)) {
let firstRange = match.rangeAt(1)
let secondRange = match.rangeAt(2)
let first = firstRange.location != NSNotFound ? (text1 as NSString).substring(with: firstRange) : nil
let second = (text1 as NSString).substring(with: secondRange)
print(first) // Optioonal("foo")
print(second) // bar
}

for match in regex.matches(in: text2, range: NSRange(0..<text2.utf16.count)) {
let firstRange = match.rangeAt(1)
let secondRange = match.rangeAt(2)
let first = firstRange.location != NSNotFound ? (text2 as NSString).substring(with: firstRange) : nil
let second = (text2 as NSString).substring(with: secondRange)
print(first) // nil
print(second) // bar
}

关于ios - swift 中带有 NSRegularExpressions 的可选捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40951099/

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