simplify output filtering in approvalTests.py
diff --git a/scripts/approvalTests.py b/scripts/approvalTests.py
index d5bb612..1ac05d1 100644
--- a/scripts/approvalTests.py
+++ b/scripts/approvalTests.py
@@ -10,17 +10,14 @@
 
 rootPath = os.path.join(catchPath, 'projects/SelfTest/Baselines')
 
-filenameParser = re.compile(r'(.*)/(.*\..pp:)(.*)')
-filelineParser = re.compile(r'(.*\..pp:)([0-9]*)(.*)')
-pathParser = re.compile(r'(.*?)/(.*\..pp)(.*)')
-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]*(.*)')
-devVersionParser = 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(.*)')
+filelocParser = re.compile(r'.*/(.+\.[ch]pp:)([0-9]*)')
+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')
 
 if len(sys.argv) == 2:
     cmdPath = sys.argv[1]
@@ -33,50 +30,34 @@
 overallResult = 0
 
 def filterLine(line):
-    m = filenameParser.match(line)
+    # make paths relative to Catch root
+    line = line.replace(catchPath + '/', '')
+
+    # strip source line numbers
+    m = filelocParser.match(line)
     if m:
-        line = m.group(2) + m.group(3)
-        m2 = filelineParser.match(line)
-        if m2:
-            line = m2.group(1) + "<line number>" + m2.group(3)
+        # note that this also strips directories, leaving only the filename
+        filename, lnum = m.groups()
+        lnum = "<line number>" if lnum else ""
+        line = filename + lnum + line[m.end():]
     else:
-        m2 = lineNumberParser.match(line)
-        if m2:
-            line = m2.group(1) + m2.group(2)
-    m = pathParser.match(line)
-    if m:
-        path = "/" + m.group(2)
-        if path.startswith(catchPath):
-            path = path[1 + len(catchPath):]
-        line = m.group(1) + path + m.group(3)
-    m = devVersionParser.match(line)
-    if m:
-        line = m.group(1) + "<version>" + m.group(2)
-    else:
-        m = versionParser.match(line)
-        if m:
-            line = m.group(1) + "<version>" + m.group(2)
+        line = lineNumberParser.sub(" ", line)
 
-    m = nullParser.match(line)
-    if m:
-        line = m.group(1) + "0" + m.group(3)
+    # strip Catch version number
+    line = versionParser.sub("<version>", line)
 
-    m = exeNameParser.match(line)
-    if m:
-        line = m.group(1) + "<exe-name>" + m.group(3)
+    # replace *null* with 0
+    line = nullParser.sub("0", line)
 
-    while True:
-        m = hexParser.match(line)
-        if m:
-            line = m.group(1) + "0x<hex digits>" + m.group(3)
-        else:
-            break
-    m = durationsParser.match(line)
-    if m:
-        line = m.group(1) + 'time="{duration}"' + m.group(2)
-    m = timestampsParser.match(line)
-    if m:
-        line = m.group(1) + 'timestamp="{iso8601-timestamp}"' + m.group(2)
+    # strip executable name
+    line = exeNameParser.sub("<exe-name>", line)
+
+    # strip hexadecimal numbers (presumably pointer values)
+    line = hexParser.sub("0x<hex digits>", line)
+
+    # strip durations and timestamps
+    line = durationsParser.sub(' time="{duration}"', line)
+    line = timestampsParser.sub(' timestamp="{iso8601-timestamp}"', line)
     return line