Regex 捕获组不能与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={(

我正在尝试使NSRegularExpression使用捕获组模式。我有字符串
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!
    }
})