用JavaScript实现Power Query中的Regexp [英] Regexp in Power Query using JavaScript

查看:42
本文介绍了用JavaScript实现Power Query中的Regexp的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要Regexp,而M/Power Query没有本机支持。我发现解决方案的几个变体都围绕着同样优秀的Web.Page&;JavaScript理念-BiccauntantHugoberry

由于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(_)), 
...

这篇关于用JavaScript实现Power Query中的Regexp的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆