Как только переменная найдена в первой, она ищет оттуда и далее, так что становится действительно сложно найти все совпадения на вашем пути.
Вот рекурсивное решение, которое я модифицировал из старого домарабочий проект, вероятно, не оптимизирован, но он работает.
public static void main(String[] args)
{
String str1 = "1010";
String str2 = "10101010";
int len = str2.length();
System.out.println(match(str1,str2,len,len,0));
}
static int match(String str1,String str2,int len,int j,int times)
{
if(j == 0)
return times;
Pattern p = Pattern.compile(str1);
Matcher m = p.matcher(str2);
int n = 0;
if(m.find()){
n = m.start()+1;
times++;
}
return match(str1,str2.substring(n,str2.length()),str2.length(),--j,times);
}