NSRegularExpressions-非捕获组不起作用

时间:2019-07-19 17:16:10

标签: swift regex

你好,我在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})

1 个答案:

答案 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