Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正在尝试在MacOS上的swift中为一个小项目解析可本地化的.string文件_Regex_Swift_String_Macos_Nsregularexpression - Fatal编程技术网

Regex 正在尝试在MacOS上的swift中为一个小项目解析可本地化的.string文件

Regex 正在尝试在MacOS上的swift中为一个小项目解析可本地化的.string文件,regex,swift,string,macos,nsregularexpression,Regex,Swift,String,Macos,Nsregularexpression,我正在尝试为MacOS上的swift中的一个小项目解析一个Localizable.string文件。 我只想检索文件中的所有键和值,将它们排序到字典中 为此,我将regex与NSRegularExpressioncocoa类一起使用 以下是这些文件的外观: "key 1" = "Value 1"; "key 2" = "Value 2"; "key 3" = "Value 3"; 这是我的代码,应该从加载到字符串中的文件中获取键和值: static func getDictionaryForm

我正在尝试为MacOS上的swift中的一个小项目解析一个Localizable.string文件。 我只想检索文件中的所有键和值,将它们排序到字典中

为此,我将regex与
NSRegularExpression
cocoa类一起使用

以下是这些文件的外观:

"key 1" = "Value 1";
"key 2" = "Value 2";
"key 3" = "Value 3";
这是我的代码,应该从加载到
字符串中的文件中获取键和值:

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 []
    }
}
使用提供的可本地化示例运行此代码时,输出如下:

(1) matches = ["\"key 1\" = \"Value 1\";"]
(1) matches = ["\"key 2\" = \"Value 2\";"]
(1) matches = ["\"key 3\" = \"Value 3\";"]
第一次出现后,匹配似乎没有停止。当我在regex101.com上尝试相同的表达式时,输出是正确的。我做错了什么?

你的函数(从?)匹配了整个模式 仅限。如果您对特定的捕获组感兴趣,那么 您必须使用
rangeAt()
访问它们,例如 (尚未更新Swift 3)

但是有一个更简单的解决方案,因为.strings文件实际上使用一种可能的属性列表格式,并且 可以直接读入词典。例如:

if let url = Bundle.main.url(forResource: "Localizable", withExtension: "strings"),
    let stringsDict = NSDictionary(contentsOf: url) as? [String: String] {
    print(stringsDict)
}
输出:

["key 1": "Value 1", "key 2": "Value 2", "key 3": "Value 3"]

对于任何感兴趣的人,我都可以使用原始函数。我需要它来编写一个小的命令行脚本,其中
NSDictionary(contentsOf:URL)
不起作用

func匹配(对于regex:String,在text:String中)->[String]{
做{
让regex=尝试NSRegularExpression(模式:regex)
设nsString=文本为nsString
guard let result=regex.firstMatch(in:text,options:[],range:NSRange(位置:0,长度:nsString.length))else{
return[]//模式与字符串不匹配
}
返回(1..[(键:字符串,文本:字符串)]{
变量dict:[(键:字符串,文本:字符串)]=[]
让exp=“\”(.*)\“[]*=[]*\”(.*)\”
用于text.components中的行(以“\n”分隔){
let match=匹配(for:exp,in:line)
如果match.count==2{
dict.append((键:匹配[0],文本:匹配[1]))
}
}
返回指令
}
用这样的方式来称呼它

let text=try!字符串(内容:url,编码:.utf8)
让stringDict=getParsedText(text:text)

您的输出似乎显示了正确的结果。可能是您错误理解了
NSRegularExpression
NSTextCheckingResult
的规范。对于该输入文本,您希望您的代码有什么输出?您是对的,我在发布后确实解决了这个问题,因为关于如何构思NSTextCheckingResult的误解。我将更新我的问题。谢谢Martin,它已修复。我将发布我的代码,以防它对其他人有所帮助。不过我不知道NSDictionary解决方案,这太棒了!哇,这真是太棒了,它就是这样工作的。遗憾的是,我还没有找到保存
上下文的方法de>(行上的注释)使用此:/@Jakub:Yes,在将文件作为属性列表读取时,注释将被忽略。我不知道有什么解决方法(除了“手动”解析文件)。