【发布时间】:2017-02-03 23:00:45
【问题描述】:
我正在尝试在 MacOS 上快速解析一个小型项目的 Localizable.string 文件。 我只想检索文件中的所有键和值以将它们排序到字典中。
为此,我在NSRegularExpression cocoa 类中使用了正则表达式。
这是这些文件的样子:
"key 1" = "Value 1";
"key 2" = "Value 2";
"key 3" = "Value 3";
这是我的代码,它应该从加载到 String 的文件中获取键和值:
static func getDictionaryFormText(text: String) -> [String: String] {
var dict: [String : String] = [:]
let exp = "\"(.*)\"[ ]*=[ ]*\"(.*)\";"
for line in text.components(separatedBy: "\n") {
let match = self.matches(for: exp, in: line)
// Following line can be uncommented when working
//dict[match[0]] = match[1]
print("(\(match.count)) matches = \(match)")
}
return dict
}
static func matches(for regex: String, in text: String) -> [String] {
do {
let regex = try NSRegularExpression(pattern: regex)
let nsString = text as NSString
let results = regex.matches(in: text, range: NSRange(location: 0, length: nsString.length))
return results.map { nsString.substring(with: $0.range) }
} catch let error as NSError {
print("invalid regex: \(error.localizedDescription)")
return []
}
}
使用提供的 Localizable 示例运行此代码时,输出如下:
(1) matches = ["\"key 1\" = \"Value 1\";"]
(1) matches = ["\"key 2\" = \"Value 2\";"]
(1) matches = ["\"key 3\" = \"Value 3\";"]
听起来比赛在第一次出现" 后并没有停止。当我在 regex101.com 上尝试相同的表达式 \"(.*)\"[ ]*=[ ]*\"(.*)\"; 时,输出是正确的。我做错了什么?
【问题讨论】:
-
您的输出似乎显示了正确的结果。也许你对
NSRegularExpression或NSTextCheckingResult的规范有误解。您对该输入文本的代码期望什么输出? -
你说得对,我在发布后实际上解决了这个问题,我只是访问第一个结果,因为对
NSTextCheckingResulta 的构思有误解。我会更新我的问题。
标签: regex swift string macos nsregularexpression