我需要 Regexp,而 M/Power Query 没有对它的原生支持。我围绕同一个优秀的 Web.Page 和 JavaScript 想法找到了几种解决方案变体 - Biccauntant , Hugoberry .
由于 JavaScript 的限制,我不得不采用它们(结果代码如下)。
主要问题是 JavaScript 对字符串变量有它自己的限制——不可能在其中使用“\”。
我的变体解决了这个问题,但我不是 JS 专业人士,所以主要问题是 - 我怀疑“\”问题不是唯一的问题。
所以我的问题是 - 有人在使用 Regexp 时看到 PQ 和 JavaScript“合作”的其他问题吗?关于字符串或其他方面的其他陷阱?
我知道 Regexp 有它自己的转义规则(这不仅是 JavaScript 的需求,而且是 Regexp 本身),所以 Regex 本身的转义不在讨论范围之内。 IE。正则表达式在作为函数参数传递之前应该被正确转义。换句话说,假设如果用户想使用带“\”的正则表达式,他必须改用“\\”,我的函数会将其转换为“\\\\”,它将传递给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
最佳答案
我知道 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(_)),
...
关于javascript - 使用 JavaScript 在 Power Query 中使用正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57547297/