我正在使用正则表达式((.*)?:)?(.*)\\/([0-9]+|[n])?
来匹配类型为module:function/arity
的模式,其中arity
可以是任何数字> = 0
或字符串n
。
成功案例应匹配:
foo:bar/1
bar/1
foo:bar/0
foo:bar/n
bar/n
这似乎在https://regex101.com/r/AtI5Nw/3上可以正常工作,但是使用以下代码,我只为"mod:func/1"
得到一个匹配组。
+ (NSArray<NSTextCheckingResult *> *)matchesInString:(NSString *)string withExpression:(NSRegularExpression *)pattern {
return [pattern matchesInString:string options:0 range:NSMakeRange(0, [string length])];
}
我尝试使用"mod:func/1"
字符串,但只得到一个匹配。如屏幕截图所示,如何获取所有匹配的组?我想从字符串中获取module
,function
和arity
部分。
答案 0 :(得分:1)
距离我这样做已经有一段时间了,但是...
matchesInString:...
返回一个NSTextCheckingResult
对象的数组。每个对象代表字符串中整个正则表达式的单个匹配项。
每个NSTextCheckingResult
对象都封装了许多“范围”(请参见numberOfRanges
属性)。然后,您使用rangeAtIndex:
提取该匹配实例中每个组的范围。
如果每个目标都在一个单独的字符串中,则不需要matchesInString:...
,只需使用firstMatchInString:...
来获得一个,而对于字符串则只需要NSTextCheckingResult
。然后,您可以通过获取每个组的范围来提取每个组,然后返回原始字符串以提取该组件的文本。