作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想要有多个可选的捕获组,我想访问它们对应的字符串。
看起来/像这样工作的东西:
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
。内容(location
和 length
)基于 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/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!