Powerbi 如何在一个字符串中搜索多个字符串?

Powerbi 如何在一个字符串中搜索多个字符串?,powerbi,powerquery,Powerbi,Powerquery,我想在powerquery的新列中检查像“这是一个测试字符串”这样的字符串是否包含任何字符串列表项{“dog”、“string”、“bark”} 我已经尝试了Text.PositionOfAny(“这是一个测试字符串”、{“dog”、“string”、“bark”}),但该函数只接受单字符值 Expression.Error: The value isn't a single-character string. 有什么解决办法吗 您可以在此处将正则表达式与逻辑OR-|表达式一起使用: /dog

我想在powerquery的新列中检查像
“这是一个测试字符串”
这样的字符串是否包含任何字符串列表项
{“dog”、“string”、“bark”}

我已经尝试了
Text.PositionOfAny(“这是一个测试字符串”、{“dog”、“string”、“bark”})
,但该函数只接受单字符值

Expression.Error: The value isn't a single-character string.

有什么解决办法吗

您可以在此处将正则表达式与逻辑OR-
|
表达式一起使用:

/dog|string|bark/.test("This is a test string") // retruns true
如果它是一个特定的(静态)匹配列表,那么您需要在PQ中添加一个带有If-then-else语句的自定义列。然后在该列上使用筛选器保留或删除列。AFAIK PQ不支持正则表达式,因此Alexey的解决方案无法工作

如果您需要动态查找,它会变得更复杂。。。但实际上你需要这样做

  • 具有原始行的ID列
  • 复制查询以便有两个查询,然后在新创建的查询中
  • 通常按空格将文本字段拆分为单独的列
  • 取消打印新创建的列
  • 获取预定名称的列表
  • 使用list.generate方法生成一个列表,如果有匹配项,则显示1,如果没有匹配项,则显示0
  • 对列表中的值求和
  • 如果sum>0,则将该行标记为匹配行,通常在新列中使用值1。然后可以筛选该表,以便在新列中仅保留值为1的行。然后根据ID对该表进行分组-这是包含匹配项的ID列表。现在使用合并功能在第一个表中合并,确保只保留与ID匹配的行。这会让你到达你想去的地方
    在这种情况下,您需要将几个M组合在一起

    您需要对列表多次使用
    Text.Contains
    ,这是
    list.Transform
    的好例子<代码>列表。AnyTrue将告诉您是否有匹配的字符串

    List.AnyTrue(List.Transform({"dog","string","bark"}, (substring) => Text.Contains("This is a test string", substring)))
    
    如果您希望有一个
    Text.ContainsAny
    函数,您可以编写它

    let
        Text.ContainsAny = (string as text, list as list) as logical =>
            List.AnyTrue(List.Transform(list, (substring) => Text.Contains(string, substring))),
        Invoked = Text.ContainsAny("This is a test string", {"dog","string","bark"})
    in
        Invoked
    

    另一个简单的解决方案是:

    List.ContainsAny(Text.SplitAny("This is a test string", " "), {"dog","string","bark"})
    

    它将文本转换为一个列表,因为在那里我们找到了一个可以满足您需要的函数。

    感谢您给我提供线索。在我自己的情况下,我需要确保字符串中存在两项,因此我将公式替换为:

    List.AllTrue(List.Transform({"/","2017"},(substring) => Text.Contains("4/6/2017 13",substring)))
    

    它完美地返回了真值。

    Power Query目前没有正则表达式支持,因此这并不能回答问题。感谢Carl,确切的解决方案有什么方法可以将此列表与切片器一起使用?即,测试字符串与所有字符串匹配(如示例中所示),但在切片器中选择“dog”时,只选择“dog”是否匹配?您是否碰巧有一个示例?将此作为一个动态过滤器,用户可以使用切片器/过滤器选择不同的单词,这将非常好。您应该接受前两个答案之一=)