gpt4 book ai didi

swift - NSRegularExpressions - 非捕获组不工作

转载 作者:行者123 更新时间:2023-11-28 13:32:43 26 4
gpt4 key购买 nike

您好,我在 NSRegularExpressions 中使用正则表达式的非捕获组功能时遇到问题

下面是一些捕获匹配的代码:

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})) 没有返回我需要的内容

我在运行时没有遇到任何错误,但我得到了我输入的相同字符串的返回 - 我正在尝试检索 workcenter: 之后的值,即 (.{ 0,20})

最佳答案

第一个问题是您的正则表达式。您不需要外部捕获组。将您的正则表达式更改为:

(?: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

关于swift - NSRegularExpressions - 非捕获组不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57117017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com