如何在Power Apps中使用MatchAll将特定字符串转换为数据表
从非标准字符串转换为Power Apps数据表
直接可用的解决方案
先清理原始字符串的格式问题,再通过MatchAll按行捕获完整对象,提取关联字段:
// 先获取原始文本 Set(RawData; Label40_1.Text); // 清理格式:移除多余的数组括号和错误分隔符,统一为可匹配的格式 Set(CleanedData; Substitute(Substitute(RawData; "]"";""["; ",";); "["; "";); "]"; "";)); // 构建目标集合 ClearCollect( ResultAG; ForAll( // 匹配每个完整的对象块 MatchAll(CleanedData; "\{.*?\}"); With( { // 提取每个字段的原始值 MessungVal: Value(Match(FullMatch; """Messung"":(?<val>\d+)").val); TiegelLeerVal: Value(Substitute(Match(FullMatch; """Tiegel leer"":""(?<val>[^""]*)""").val; ";"; ".")); TiegelProbeVal: Value(Substitute(Match(FullMatch; """Tiegel Probe"":""(?<val>[^""]*)""").val; ";"; ".")); TiegelAscheVal: Value(Substitute(Match(FullMatch; """Tiegel Asche"":""(?<val>[^""]*)""").val; ";"; ".")) }; // 构造数据表行 { Messung: MessungVal; Tiegel_leer: TiegelLeerVal; Tiegel_Probe: TiegelProbeVal; Tiegel_Asche: TiegelAscheVal } ) ) )
简化版:单正则直接捕获所有字段
如果不想做前置清理,也可以用一个正则直接匹配每个对象的所有字段:
ClearCollect( ResultAG; ForAll( MatchAll( Label40_1.Text; """Messung"":(?<Messung>\d+);""Tiegel leer"":""(?<Tiegel_leer>[^""]*)"";""Tiegel Probe"":""(?<Tiegel_Probe>[^""]*)"";""Tiegel Asche"":""(?<Tiegel_Asche>[^""]*)""" ); { Messung: Value(Messung); Tiegel_leer: Value(Substitute(Tiegel_leer; ";"; ".")); Tiegel_Probe: Value(Substitute(Tiegel_Probe; ";"; ".")); Tiegel_Asche: Value(Substitute(Tiegel_Asche; ";"; ".")) } ) )
关于MatchAll的核心逻辑
MatchAll(文本, 正则)返回一个数据表,每行对应一个匹配结果,包含FullMatch(完整匹配字符串)和你用(?<字段名>匹配规则)定义的捕获组字段。- 你之前的错误是单独提取每个字段,得到的是四个独立的单列表,无法关联行。正确逻辑是先按完整对象(行)匹配,再在每个对象内提取所有字段,这样每行的字段自然对应。
- 正则里的
[^""]*表示匹配所有非引号的字符,确保只捕获字段值;.*?是非贪婪匹配,避免把多个对象当成一个匹配项。
处理德语小数格式
因为德语环境用;作为小数分隔符,所以用Substitute(值; ";"; ".")转换为Power Apps可识别的数值格式,再用Value()转成数字类型。
内容的提问来源于stack exchange,提问作者Thomas Schmidt
相关产品推荐
相关产品推荐

