Headers should be written to, as much as possible, 1) be independent of what may have already be included, and 2) not introduce problems (such as macros for common identifiers) for headers later included. When both of these are true, the order in which you include doesn't matter. If these aren't true, you should fix that in your own headers, or deal with it as necessary otherwise.
Thus, the choice is arbitrary, but it is still important that you make a choice! "The plan is nothing, but the planning is everything." Consistency leads to more readable code.
A relatively common order is standard library, system (as in OS), external libraries, and then headers for the same project as the current file – with the one exception of an implementation file including its "corresponding" header (if there is one) first, before any includes or other code. Within each group, I sort alphabetically by habit, because, again, it's completely arbitrary but some easy to use order lets me quickly read and update the list.
Applied to your list:
// first only because this is required in your precompiled header setup
#include "stdafx.h"
// it's too bad this can't really be first
// I'm guessing "This" refers to the corresponding header
#include "This.h"
// C stdlib then C++ stdlib is what I usually do,
// whether the C headers are spelled XXX.h or cXXX.
#include <math.h>
#include <stdio.h>
#include <iostream>
#include <list>
#include <string>
// someone mentioned winsock2 needs to be before windows
#include <Winsock2.h>
#include <tchar.h>
#include <Windows.h>
#include <boost/regex.hpp>
#include "mystring_written_by_c.h"
#include "mystring_written_by_cpp.h"
The line breaks above to split into groups are deliberate. I would leave a comment on why winsock2 is given its own group, but the rest of the comments would not normally be there.