# Why is StringMatchQ["IP1", "IP"] returning False?

Maybe there is a knot in my head, but I would expect that

StringMatchQ["IP1", "IP"]


should return True (which it does not) just as

StringFreeQ["IP1", "IP"]


returns False (which it does). What am I missing?

• If StringFreeQ is to strings as FreeQ is to expressions, then StringMatchQ is to strings as MatchQ, and not as MemberQ, is to expressions
– Rojo
Aug 27, 2012 at 13:02
• Related: (8945) Mar 23, 2015 at 12:22

StringMatchQ tests the pattern, and "IP1" doesn't match the pattern "IP", it does match the pattern ___~~"IP"~~___, but that's a different pattern! Similarly you could write your pattern as StringMatchQ["IP1", "IP*"]

StringFreeQ however doesn't just test the entire string, it tests every substring, so in effect the ___~~pattern~~___ is added by the function itself to your pattern.

• StringMatchQ["IP1", "*IP*"] is the more appropriate equivalent to StringMatchQ["IP1", ___~~"IP"~~___], no? Aug 27, 2012 at 13:18
• Thanks, that helps a lot. I find it also odd that StringMatchQ["IP1", RegularExpression["IP"]] is False. Aug 27, 2012 at 13:37
• @J.M. Yes, I was referring to his pattern in particular, however i suppose that wasn't clearly stated. Aug 27, 2012 at 13:55
• @KarstenW. RegularExpression["IP"] is an exact "pattern", so you are asking if your string is equal to "IP", in other languages the pattern would be "^IP\$". If you want to match anything containing IP, you have to specify the "anything containing" part of the pattern. StringMatchQ["IP1", RegularExpression[".*IP.*"]] is True. Aug 27, 2012 at 13:57
• @Karsten, in short, StringMatchQ[] doesn't implicitly insert wildcards; if you want wildcards, you need to explicitly put them in. Aug 27, 2012 at 13:59

If you like to think in negatives and avoid regular expressions:

!StringFreeQ["IP1", "IP"]


True