# 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 '12 at 13:02
Related: (8945) –  Mr.Wizard Mar 23 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 '12 at 13:18
Thanks, that helps a lot. I find it also odd that StringMatchQ["IP1", RegularExpression["IP"]] is False. –  Karsten W. Aug 27 '12 at 13:37
@J.M. Yes, I was referring to his pattern in particular, however i suppose that wasn't clearly stated. –  jVincent Aug 27 '12 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. –  jVincent Aug 27 '12 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 '12 at 13:59

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

!StringFreeQ["IP1", "IP"]


True

-