Swift 5.7 RegexBuilder匹配Wi-Fi设备仅开头有效问题求助
正则匹配Wi-Fi对应设备失败的解决方法
问题场景
通过终端命令networksetup -listnetworkserviceorder获取的网络服务报告示例如下:
An asterisk (*) denotes that a network service is disabled. (1) Ethernet (Hardware Port: Ethernet, Device: en0) (2) Wi-Fi (Hardware Port: Wi-Fi, Device: en1) (3) iPhone USB (Hardware Port: iPhone USB, Device: en6) (4) Thunderbolt Bridge (Hardware Port: Thunderbolt Bridge, Device: bridge0) (5) VPN (VPN2) (Hardware Port: L2TP, Device: )
尝试用Swift 5.7的RegexBuilder编写正则匹配Wi-Fi对应的en1,代码如下:
let search = Regex { "Hardware Port: Wi-Fi, Device: " Capture { OneOrMore(.word) } } if let result = try? search.wholeMatch(in: info) { print("Device: \(result.1)") }
但该正则仅在目标字符串位于文本开头时有效,其余情况返回nil;改用字面量正则语法:
let search = /Hardware Port: Wi-Fi, Device: (\w+)/
结果仍为nil,需要解决匹配失效问题。
解决方法
核心问题是使用了wholeMatch(in:)方法——这个方法要求整个输入字符串完全匹配正则表达式,但我们的目标只是匹配文本中的某一段子串。只需替换匹配方法并微调正则即可解决:
修正方案1:RegexBuilder版本
import RegexBuilder let info = """ An asterisk (*) denotes that a network service is disabled. (1) Ethernet (Hardware Port: Ethernet, Device: en0) (2) Wi-Fi (Hardware Port: Wi-Fi, Device: en1) (3) iPhone USB (Hardware Port: iPhone USB, Device: en6) (4) Thunderbolt Bridge (Hardware Port: Thunderbolt Bridge, Device: bridge0) (5) VPN (VPN2) (Hardware Port: L2TP, Device: ) """ let search = Regex { "Hardware Port: Wi-Fi, Device: " Capture { OneOrMore(.word) } } if let result = try? search.firstMatch(in: info) { print("Device: \(result.1)") // 输出 Device: en1 }
修正方案2:字面量正则版本
let search = /Hardware Port: Wi-Fi, Device: (\w+)/ if let result = try? search.firstMatch(in: info) { print("Device: \(result.1)") // 输出 Device: en1 }
额外优化:兼容设备为空的情况
如果需要处理设备字段为空的场景(比如示例中的VPN条目),可以调整正则允许捕获空内容:
// RegexBuilder版本 let search = Regex { "Hardware Port: Wi-Fi, Device: " Capture { ZeroOrMore(.word) } } // 字面量版本 let search = /Hardware Port: Wi-Fi, Device: (\w*)/
内容的提问来源于stack exchange,提问作者Hadi Sharghi
相关产品推荐
相关产品推荐

