7

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?

Karsten W.
  • 1,383
  • 8
  • 21

2 Answers2

15

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.

jVincent
  • 14,766
  • 1
  • 42
  • 74
  • 1
    StringMatchQ["IP1", "*IP*"] is the more appropriate equivalent to StringMatchQ["IP1", ___~~"IP"~~___], no? – J. M.'s missing motivation 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
  • 2
    @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.'s missing motivation Aug 27 '12 at 13:59
3

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

!StringFreeQ["IP1", "IP"]

True

image_doctor
  • 10,234
  • 23
  • 40