Regex 捕获组不能与NSRegularExpression一起使用
我正在尝试使NSRegularExpression使用捕获组模式。我有字符串Regex 捕获组不能与NSRegularExpression一起使用,regex,swift,nsregularexpression,Regex,Swift,Nsregularexpression,我正在尝试使NSRegularExpression使用捕获组模式。我有字符串abc{=2}和正则表达式模式{(+)}来获取=2字符串,但每次尝试创建NSRegularExpression实例都以 Optional(Error Domain=NSCocoaErrorDomain Code=2048 "The operation couldn’t be completed. (Cocoa error 2048.)" UserInfo=0x7fad7253cb40 {NSInvalidValue={(
abc{=2}
和正则表达式模式{(+)}
来获取=2
字符串,但每次尝试创建NSRegularExpression
实例都以
Optional(Error Domain=NSCocoaErrorDomain Code=2048 "The operation couldn’t be completed. (Cocoa error 2048.)" UserInfo=0x7fad7253cb40 {NSInvalidValue={(.+)}})
代码:
我找不出这个图案有什么问题。我正在使用regex101.com页面,它在那里工作
提前谢谢你
编辑
我看到转义花括号(
\{(+)\}
)解决了错误问题,但我得到了{=2}
,而不是=2
我用不同的模式修复了这个问题。我现在不知道regex101.com是否匹配错误,我的模式的正确匹配是{=2}
而不是“=2”
我使用了正向前瞻和正向前瞻来匹配这一点。这是一种模式:
(?这是NSRegularExpression
的一个特性,也许更是如此NSTextCheckingResult
。捕获的范围实际上是NSTextCheckingResult
结果实例的索引1
处的范围
例如:
let rx = NSRegularExpression(pattern: "\\{(.+?)\\}", options: .CaseInsensitive, error: nil)!
let str = "abc{=2}"
let strRange = NSMakeRange(0, count(str))
rx.enumerateMatchesInString(str, options: nil, range: strRange, usingBlock: { result, flags, stop in
if let range0 = result?.range {
println( (str as NSString).substringWithRange(range0) ) // "{=2}"
}
if let range1 = result?.rangeAtIndex(1) {
println( (str as NSString).substringWithRange(range1) ) // "=2" <-- this is what you want!
}
})
let rx=NSRegularExpression(模式:“\\{(+?)\\}”,选项:。不区分大小写,错误:nil)!
设str=“abc{=2}”
设strRange=NSMakeRange(0,计数(str))
枚举匹配安装(str,选项:nil,范围:strRange,usingBlock:{result,flags,stop in
如果let range 0=结果?.range{
println((str作为NSString.substringWithRange(range0))/“{=2}”
}
如果让range1=结果?.rangeAtIndex(1){
println((str作为NSString)。substringWithRange(range1))/“=2”您的答案应该可以。但它不是标准答案。许多语言等甚至不允许您进行环视,但大多数语言允许捕获组。谢谢,花了一段时间与贫民区范围偏移进行斗争。
let rx = NSRegularExpression(pattern: "\\{(.+?)\\}", options: .CaseInsensitive, error: nil)!
let str = "abc{=2}"
let strRange = NSMakeRange(0, count(str))
rx.enumerateMatchesInString(str, options: nil, range: strRange, usingBlock: { result, flags, stop in
if let range0 = result?.range {
println( (str as NSString).substringWithRange(range0) ) // "{=2}"
}
if let range1 = result?.rangeAtIndex(1) {
println( (str as NSString).substringWithRange(range1) ) // "=2" <-- this is what you want!
}
})