Approval tests are now mostly Windows compatible

There are some differences in output between Catch on Windows and
Catch on Linux, that indicate a minor bug, but those have to be fixed separately.
diff --git a/scripts/approvalTests.py b/scripts/approvalTests.py
index e09c535..e57241d 100644
--- a/scripts/approvalTests.py
+++ b/scripts/approvalTests.py
@@ -13,14 +13,28 @@
 
 rootPath = os.path.join(catchPath, 'projects/SelfTest/Baselines')
 
-filelocParser = re.compile(r'.*/(.+\.[ch]pp:)([0-9]*)')
+
+filelocParser = re.compile(r'''
+    .*/
+    (.+\.[ch]pp)  # filename
+    (?::|\()      # : is starting separator between filename and line number on Linux, ( on Windows
+    ([0-9]*)      # line number
+    \)?           # Windows also has an ending separator, )
+''', re.VERBOSE)
 lineNumberParser = re.compile(r' line="[0-9]*"')
 hexParser = re.compile(r'\b(0[xX][0-9a-fA-F]+)\b')
 durationsParser = re.compile(r' time="[0-9]*\.[0-9]*"')
 timestampsParser = re.compile(r' timestamp="\d{4}-\d{2}-\d{2}T\d{2}\:\d{2}\:\d{2}Z"')
 versionParser = re.compile(r'Catch v[0-9]+\.[0-9]+\.[0-9]+(-develop\.[0-9]+)?')
 nullParser = re.compile(r'\b(__null|nullptr)\b')
-exeNameParser = re.compile(r'\b(CatchSelfTest|SelfTest)\b')
+exeNameParser = re.compile(r'''
+    \b
+    (CatchSelfTest|SelfTest)  # Expected executable name
+    (?:.exe)?                 # Executable name contains .exe on Windows.
+    \b
+''', re.VERBOSE)
+# This is a hack until something more reasonable is figured out
+specialCaseParser = re.compile(r'file\((\d+)\)')
 
 if len(sys.argv) == 2:
     cmdPath = sys.argv[1]
@@ -43,15 +57,19 @@
 
 
 def filterLine(line):
-    # make paths relative to Catch root
-    line = line.replace(catchPath + '/', '')
+    if catchPath in line:
+        # make paths relative to Catch root
+        line = line.replace(catchPath + os.sep, '')
+        # go from \ in windows paths to /
+        line = line.replace('\\', '/')
+
 
     # strip source line numbers
     m = filelocParser.match(line)
     if m:
         # note that this also strips directories, leaving only the filename
         filename, lnum = m.groups()
-        lnum = "<line number>" if lnum else ""
+        lnum = ":<line number>" if lnum else ""
         line = filename + lnum + line[m.end():]
     else:
         line = lineNumberParser.sub(" ", line)
@@ -71,6 +89,7 @@
     # strip durations and timestamps
     line = durationsParser.sub(' time="{duration}"', line)
     line = timestampsParser.sub(' timestamp="{iso8601-timestamp}"', line)
+    line = specialCaseParser.sub('file:\g<1>', line)
     return line