• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-11 22:19:49 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有一个正则表达式,旨在从 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,任何想法都会受到欢迎。



Best Answer-推荐答案


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

有两种方式:

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

这里是方法2,推荐:

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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap