你好,我在NSRegularExpressions中使用regex的Non-Capture组功能遇到麻烦
这里有一些代码可以捕获匹配项:
func matches(for regex: String, in text: String) -> [String] {
do {
let regex = try NSRegularExpression(pattern: regex);
let results = regex.matches(in: text,
range: NSRange(text.startIndex..., in: text));
return results.map {
String(text[Range($0.range, in: text)!]);
};
} catch let error {
print("invalid regex: \(error.localizedDescription)")
return [];
};
};
因此,现在进入正则表达式,我有一个字符串形式的workcenter:WDO-POLD
应该很容易实现,但是正则表达式字符串((?:workcenter:)(.{0,20}))
并没有返回我需要的内容< / p>
我在运行时没有错误,但是返回了我输入的相同字符串-我正在尝试检索workcenter:
之后的值,即(.{0,20})
答案 0 :(得分:1)
第一个问题是您的正则表达式。您不需要外部捕获组。将正则表达式更改为:
(?:workcenter:)(.{0,20}) <-- outer capture group removed
下一个问题是如何进行映射。您正在访问匹配的全部范围,而不是所需的捕获组。由于您具有用于处理任何正则表达式的通用函数,因此很难处理所有可能性,但是以下更改解决了您的直接示例,因此应与不具有捕获组和具有捕获组的正则表达式一起使用。
将映射行更新为:
return results.map {
regex.numberOfCaptureGroups == 0 ?
String(text[Range($0.range, in: text)!]) :
String(text[Range($0.range(at: 1), in: text)!])
}
这将检查您的正则表达式中有多少个捕获组。如果没有,则返回完整匹配。但是,如果有1个或更多,它将仅返回第一个捕获组的值。
如果将正则表达式更改为:
,您也可以使用原始映射。(?<=workcenter:)(.{0,20})
这里有一个简单得多的解决方案。
您还有很多额外的群组。卸下最外层,不需要非捕获组。只需使用workcenter:(.{0,20})
。然后,您可以使用$1
引用所需的捕获组。
在这种情况下,不需要NSRegularExpression
。使用简单的字符串替换。
let str = "workcenter:WDO-POLD"
let res = str.replacingOccurrences(of: "workcenter:(.{0,20})", with: "$1", options: .regularExpression)
这给出了WDO-POLD
。