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

时间:2016-02-10 13:31:29

标签: powerbi powerquery

如果像"This is a test string"这样的字符串包含任何字符串列表项{"dog","string","bark"},我想检入powerquery新列。

我已经尝试了Text.PositionOfAny("This is a test string",{"dog","string","bark"}),但该功能只接受单字符值

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

任何解决方案?

5 个答案:

答案 0 :(得分:8)

在这种情况下,您希望将几个M library functions组合在一起。

您希望对列表多次使用Text.Contains,这对List.Transform来说是个好例子。 List.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

答案 1 :(得分:2)

Another simple solution is this:

public function updateblockquotes($data)
{
     extract($data);
$this->db->where('id', $id);
return $this->db->update('technical_slide_blockquotes', array('text' => $text));
}

It transforms the text into a list because there we find a function that does what you need.

答案 2 :(得分:1)

如果它是特定(静态)匹配列表,您将要在PQ中添加带有if then else语句的自定义列。然后在该列上使用过滤器来保留或删除列。 AFAIK PQ不支持正则表达式,因此Alexey的解决方案无法正常工作。

如果您需要查找是动态的,它会变得更复杂......但是您可能需要

  1. 拥有原始行的ID列。
  2. 复制查询,以便您有两个查询,然后在新创建的查询中
  3. 将文本字段拆分为单独的列,通常按空格
  4. 取消新创建的列。
  5. 获取预期名称列表
  6. 使用list.generate方法生成一个列表,如果匹配则显示1,如果没有匹配则显示0。
  7. 汇总列表的值
  8. 如果总和> 0然后将该行标记为匹配,通常我在新列中使用值1。然后,您可以过滤表以仅在新列中保留值为1的行。然后将此表分组到ID上 - 这是包含匹配项的ID列表。现在使用合并功能在第一个表中合并,确保只保留与ID匹配的行。那会让你到达你想去的地方。

答案 3 :(得分:0)

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

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

它完美地回归了。

答案 4 :(得分:-2)

您可以在此处使用带有逻辑OR的{regex - |表达式:

/dog|string|bark/.test("This is a test string") // retruns true