用JavaScript实现Power Query中的Regexp
我需要Regexp,而M/Power Query没有本机支持。我发现解决方案的几个变体都围绕着同样优秀的Web.Page&;JavaScript理念-Biccauntant,Hugoberry。
由于JavaScript的限制,我不得不采用它们(生成的代码如下所示)。
主要问题是,JavaScript对字符串变量有自己的凝灰岩限制--不可能在其中使用""。
我的变体解决了这个问题,但我不是JS方面的专业人员,所以主要问题是-我怀疑""问题并不是唯一的问题。
因此,我的问题是--在使用Regexp时,有没有人看到PQ&;JavaScript"协作"方面的其他问题?关于字符串的其他缺陷,或者其他什么?我知道Regexp有它自己的转义规则(这不仅是JavaScript请求,而且是Regexp本身),所以Regexp本身的转义不在问题的讨论范围之内。也就是说,在将正则表达式作为函数参数传递之前,应该正确地对其进行转义。换句话说,假设如果用户想要使用带""的正则表达式,则必须使用"\",我的函数会将其转换为"\\",并将其作为Regexp表达式传递给JavaScript。
对于PQ用户-事实证明,该解决方案的性能至少对于数百行来说是相当好的。但不要忘记,无法在Power BI服务中使用该功能,这仅适用于PowerBI Desktop和Excel。
代码:
(text as nullable text, pattern as nullable text) as logical =>
let
l = List.Transform({text, pattern}, each Text.Replace(_, "", "\")),
t = Text.Format("<script>document.write(new RegExp('#{1}').test('#{0}'))</script>", l),
w = Web.Page(t),
d = w[Data]?{0}?[Children]?{0}?[Children]?{1}?[Text]?{0}?,
result = text <> null and (pattern = null or (if d <> null then Logical.FromText(d) else error "Regular expression or text are not supported by JavaScript."))
in
result
解决方案
我知道Java脚本,但我不知道Powerbi/PowerQuery,因此此答案可能不完整。
字符串中还有其他需要转义的字符。
对于单引号的字符串文字,和
'
需要转义,一些空格字符(如换行符)也需要转义。在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String上有一个逃生列表。其中一些是可选的,但我不确定具体是哪些。我认为你永远不需要有十六进制数字的任何一个。我说的是'
需要转义,而不是"
,但如果您使用双引号字符串("#{0}"
),则情况正好相反。
除此之外,我不能告诉您PowerQuery需要进行哪些转义。事实上,我很惊讶您的字符串文字"\"
按预期工作。
总之,它应该如下所示(并且可以随时更正我的PowerQuery语法错误):
// Define function escapeString which inserts before each or ' and then applies the escape sequences
, , v, , and f.
let
l = List.Transform({text, pattern}, each escapeString(_)),
...
相关文章