使用 JavaScript 在 Power Query 中使用正则表达式

And*_*kov 5 javascript powerquery powerbi

我需要 Regexp,而 M / Power Query 没有对其的本机支持。我发现了围绕同一个优秀的 Web.Page & JavaScript 想法的几种解决方案变体 - BiccauntantHugoberry

由于 JavaScript 的限制,我不得不采用它们(生成的代码如下)。

主要问题是 JavaScript 对字符串变量有自己的限制 - 不可能在其中使用“\”。

我的变体解决了这个问题,但我对 JS 并不专业,所以主要问题是 - 我怀疑“\”问题并不是唯一的问题。

所以我的问题是 - 在使用 Regexp 时是否有人看到 PQ 和 JavaScript“合作”的其他问题?关于字符串的其他陷阱,或者其他什么?

我知道 Regexp 有它自己的转义规则(这不仅是 JavaScript 的需求,而且是 Regexp 本身),因此 Regex 本身的转义超出了问题的范围。即,在将正则表达式作为函数参数传递之前,应对其进行正确转义。换句话说,假设如果用户想要使用带有“\”的正则表达式,他必须使用“\\”代替,我的函数会将其转换为“\\\\”,它将传递给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
Run Code Online (Sandbox Code Playgroud)

Dav*_*ipe 3

我知道 javascript,但我不知道 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 \n, \r, \v, \t, \b and \f.
let 
    l = List.Transform({text, pattern}, each escapeString(_)), 
...
Run Code Online (Sandbox Code Playgroud)