You can do something like AND using a positive look ahead
(?=.*cat)(?=.*dog).*
See here on Rubular. Updated link!
This positive lookhhead (?=.*cat)checks to see if somewhere inside the string "cat", the same as for "dog" is used (?=.*dog). If both of these statements are true, then the full line is matched with .*at the end.
The advantage is that it will also fit
dog and cat
and not only
cat and dog
but he will also fit
,
(?=.*\bcat\b)(?=.*\bdog\b).*
\b - , .