我有一个正则表达式,旨在从 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 正则表达式后视允许 limiting(或 interval,range)量词,这就是为什么它们也被称为“约束宽度”)这里是方法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/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |