查找在另一个字符串列表中有一个项目的子字符串的所有字符串

问题描述:

我有以下代码。查找在另一个字符串列表中有一个项目的子字符串的所有字符串

let s1 = [(12, "abcde12345"); (23, "bcdef2345"); (12, "xyzafg3838")] 
let s2 = ["bcd"; "345"] 

什么是找到s1的所有项目,其第二项在s2任何一个的子串的最佳方式?

(12,“abcde12345”); (23,“bcdef2345”)

在我的真实代码s1是Seq

我想出了一个。

s1 |> Seq.filter (fun i -> List.exists (fun e -> (snd i).Contains(e)) s2) 
+0

什么是做'S1点|>'这里?为什么不'Seq.filter()s1'?你可以使用模式匹配来避免'snd'像'fun(_,x) - > ... x.Contains(e)...'。 –

+0

你可以使它成为无点'(x.Contains)'而不是'fun e - > x.Contains(e)' –

+0

它的工作方式 – ca9163d9

将第二组中的所有项目都变为正则表达式,然后将其应用于第一组中的每个项目。

open System 
open System.Text.RegularExpressions 

let setA = [ "One"; "Two"; "Three" ] 
let setB = [ "o"; "n" ]; 

let pattern = String.Join("|", setB); 
let regex = new Regex(pattern); 

let results = setA |> List.filter (fun str -> regex.Match(str).Success) 

results |> List.iter (fun result -> Console.WriteLine(result)) 

Seq.filter (fun (_, x) -> List.exists (x.Contains) s2) s1