# Select certain term containing some patterns and confusing pattern Alternatives in FreeQ

I am considering a function termsContain[func_,list_] which select in an expression func the terms containing the ones in the list. The func in general is a sum of some terms and could also be only one term, for example,

in:= termsContain[a + b + c + a x +b y, {x,y}]
out= a x+b y

in:= termsContain[a + b + c + f[a x +c]+b y, {a x}]
out=f[c + a x]

in:= termsContain[a x , {a x}]
out= a x

in:=  termsContain[a + b + c + a x[i] y[j] +b x[l] y[m] , {x[_]y[_]}]
out= a x[i] y[j]+b x[l] y[m]


I came up with this :

termsContain[func_, list_] :=  func /. (Longest[u___?(Not[FreeQ[#, Alternatives @@ list]] &)] + v___) :> (Plus[u]);


This works fine for the first three examples, but not for the last one. For the last one, this gives only zero

out=0


Try another example which is also not as expected:

in:=termsContain[a + b + c + a x[i] y[j] +b x[l] y[m] +c f[x[l] y[m]], {x[_]y[_]}]
out= c f[x[l] y[m]]


I thought it should give a x[i] y[j] +b x[l] y[m] +c f[x[l] y[m]]. How to understand these results? I did some experiments, the problem seems to be the FreeQ combined with Alternatives. The Alternatives seems not to take one argument, that is, Alternatives[x[_] y[_]] does not match x[_] y[_] as I thought. See these examples,

in:=FreeQ[a x[i] y[j] +b x[l] y[m], x[_] y[_]]
out= False
in:=FreeQ[a x[i] y[j] +b x[l] y[m], Alternatives[x[_] y[_]]]
out= True


But the out and the out seem to give the correct answer. Why? I am really confused. And how to modify the code to give the expected answer? Thanks!

Appendix: We can test this, for a special case without using Alternatives

   in:= c a[i] x[j] + d f[a[l] x[m]] + f + l +   d a[l] x[n] /. (Longest[u___?(Not[FreeQ[#, a[i_] x[j_]]] &)] + v___) :> (Plus[u])
out= d f[a[l] x[m]] + c a[i] x[j] + d a[l] x[n]


It works here. So the problem really is in Alternatives. FreeQ combined with Alternatives is really confusing, look at these

in:= FreeQ[a x y, a x ]
out= False
in:= FreeQ[a x y, a x | y ]
out= False
in:= FreeQ[a x y, a x | a y ]
out= True


Modify the in a little

in:= termsContain[a + b + c + f[a x y + c] + b x y, { x }]
out= b x y + f[c + a x y]
in:= termsContain[a + b + c + f[a x y + c] + b x y, { a x }]
out=0
in:= termsContain[a + b + c + f[a x y + c] + b x y, { b y }]
out=0


Edit:

At last, I come to this realization,

termsContain[func_, list_] := func /. (Longest[
u___?(Not[And @@ (Through[(FreeQ[#] & /@ list)[#]])] &)] +
v___) :> (Plus[u]);


which is what I want. But I still would like to know how to understand the Alternatives in FreeQ.