gpt4 book ai didi

ios - RegEx 在 RegexR 中在线工作,但在 NSRegularExpression 中无法在 iOS 上初始化

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:59:36 25 4
gpt4 key购买 nike

我有一个正则表达式,用于从 CocoaPods 定义中提取 git URL。

输入文字如下:

pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :branch => 'dev'

正则表达式如下:

(?<=('Alamofire'.*:git => '))[A-Za-z:/\.]+(?=('{1}))

此正则表达式在 RegexR 上正常工作,请参阅 here ,但是当尝试用它初始化 NSRegularExpression 时,会抛出一个错误,代码为 2048,表示模式无效。通常这是由于缺乏转义,但这里没有。即使在拖网了 iOS 使用的引擎 ICU 正则表达式文档之后,我也无法弄清楚问题是什么。

任何想法都会受到欢迎,TIA。

最佳答案

您不能在具有 ICU 正则表达式的回顾模式中使用未知长度的模式。您的模式在后视中包含 .*,因此它是无效的 ICU regexp (请参阅后视模式匹配的可能字符串的长度不得无限制(无*+ 运算符。) ICU 后视文档部分)。

有两种方式:

  • .* 替换为 .{0,x} 其中 x 是您希望分隔左侧的最大字符数来自右侧模式的模式,ICU 正则表达式后视允许限制(或间隔范围)量词,这就是为什么它们也被称为“约束宽度”)
  • 重新设计您的模式以使用消费模式而不是环顾四周,用捕获括号包裹您需要提取的部分并修改您的代码以获取第 1 组值。

这里是方法二,推荐:

let str = "pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :branch => 'dev'"
let rng = NSRange(location: 0, length: str.utf16.count)
let regex = try! NSRegularExpression(pattern: "'Alamofire'.*:git\\s*=>\\s*'([^']+)'")
let matches = regex.matches(in: str, options: [], range: rng)
let group1 = String(str[Range(matches[0].range(at: 1), in: str)!])
print(group1) // => https://github.com/Alamofire/Alamofire.git

参见 regex demo ,绿色突出显示的子字符串是您在第 1 组中获得的值。

图案细节:

  • 'Alamofire' - 文字字符串
  • .* - 除换行字符外的任何 0+ 个字符,尽可能多(替换为 .*? 以匹配尽可能少的字符)
  • :git - 文字子串
  • \s*=>\s* - 用 0+ 个空格包裹的 => 子字符串
  • '([^']+)' - ',然后是捕获组 #1 匹配除 ' 以外的 1+ 个字符,并且然后是一个 ' 字符。

关于ios - RegEx 在 RegexR 中在线工作,但在 NSRegularExpression 中无法在 iOS 上初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55038991/

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