Wow! That was tough. I found an article online that talked about a possible way to build an If-Else..Then statement in InfoPath. The article spoke about using a Concat statement. My issue was that the rules above only set the Error/Good field on the very first attempt. I had to create a rule that ran on Field Change. So, I created an Action step and left the Condition blank and put in some variation of the following statement to get my field conditions to return the correct value:
concat(substring("Error", 1, (not(starts-with(., "P")) and not(starts-with(., "A")) and not(starts-with(., "Q")) and not(starts-with(., "R")) and not(starts-with(., "U")) and not(starts-with(., "T")) or substring(., 2, 4) != SystemCode or substring(., 6, 3) != "SPM" or substring(., 9, 1) != "." or substring(., 17, 1) != "S" or not(xdUtil:Match(string(substring(., 14, 3)), "\d\d\d"))) * string-length("Error")), substring("Good", 1, ((starts-with(., "P")) and (starts-with(., "A")) and (starts-with(., "Q")) and (starts-with(., "R")) and (starts-with(., "U")) and (starts-with(., "T")) and substring(., 2, 4) = SystemCode and substring(., 6, 3) = "SPM" and substring(., 9, 1) = "." and substring(., 17, 1) = "S" and (xdUtil:Match(string(substring(., 14, 3)), "\d\d\d"))) * string-length("Good")))