gpt4 book ai didi

dart - String.replaceAllMapped 具有异步结果

转载 作者:行者123 更新时间:2023-12-02 03:36:14 26 4
gpt4 key购买 nike

我正在开发一个需要模板的项目。主模板有一个指定数据源的导入属性。然后使用 String.replaceAllMapped 读取数据并将其插入到字符串中。以下代码可以与 File api 配合使用,因为它有一个 readAsStringSync 方法来同步读取文件。我现在想从任何返回 Future 的任意流中读取数据。

在这种情况下如何使 async/await 工作?我还寻找了 ReplaceAllMapped 的异步兼容替代品,但我还没有找到不需要多次通过正则表达式的解决方案。

这是我的代码的一个非常简单的示例:

String loadImports(String content){
RegExp exp = new RegExp("import=[\"\']([^\"\']*)[\"\']>\\s*<\/");

return content.replaceAllMapped(exp, (match) {
String filePath = match.group(1);

File file = new File(filePath);
String fileContent = file.readAsStringSync();

return ">$fileContent</";
});
}

使用示例:

print(loadImports("<div import='myfragment.txt'></div>"))

最佳答案

试试这个:

Future<String> replaceAllMappedAsync(String string, Pattern exp, Future<String> replace(Match match)) async {
StringBuffer replaced = new StringBuffer();
int currentIndex = 0;
for(Match match in exp.allMatches(string)) {
String prefix = match.input.substring(currentIndex, match.start);
currentIndex = match.end;
replaced
..write(prefix)
..write(await replace(match));
}
replaced.write(string.substring(currentIndex));
return replaced.toString();
}

要使用上面的示例:

Future<String> loadImports(String content) async {
RegExp exp = new RegExp("import=[\"\']([^\"\']*)[\"\']>\\s*<\/");

return replaceAllMappedAsync(content, exp, (match) async {
String filePath = match.group(1);

File file = new File(filePath);
String fileContent = await file.readAsString();
return ">$fileContent</";
});
}

像这样使用:

loadImports("<div import='myfragment.txt'></div>").then(print);

或者,如果在异步函数中使用:

print(await loadImports("<div import='myfragment.txt'></div>"));

关于dart - String.replaceAllMapped 具有异步结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34342822/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com