Mathematica Stack Exchange is a question and answer site for users of Mathematica. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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?

share|improve this question
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 '15 at 12:22
up vote 14 down vote accepted

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.

share|improve this answer
StringMatchQ["IP1", "*IP*"] is the more appropriate equivalent to StringMatchQ["IP1", ___~~"IP"~~___], no? – J. M. 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. – J. M. Aug 27 '12 at 13:59

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

!StringFreeQ["IP1", "IP"]


share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.