Mathematica Programming » Code Structure

Replacement Patterns

The fundamental usage of patterns is in replacement. This is just what it sounds like. One replaces part of an expression with something else. There’s a whole family of functions built around this concept, too, and they’re some of the oldest functions in the language. They all share one parent, though

Replace

Replace is possibly the most fundamental function in Mathematica. It takes an expression and if it matches a pattern, replaces it with that value. For example:

 Replace[{1, 2, 3}, a : {__Integer} :> Column@a]
21-3692143705990288316

If the pattern doesn’t match, nothing happens:

 Replace[{1, 2, 3},
  a : {RandomInteger[1000], RandomReal[1000], RandomReal[1000]} :>
    "This has a 1/1000000000 chance of being the result"
  ]
 {1, 2, 3}

Replace can also try a list of replacements:

 Replace[{1, 2, 3},
  {
    {_Integer, _Integer, _String} :> "No",
    {_Integer, _Integer, _List} :> "No",
    {_Integer, _Integer, _Association} :> "No",
    {_Integer, _Integer, _Integer} :> "Yes!",
    {__Integer} :> "Yes, but won't happen"
    }
  ]
 "Yes!"

You’ll notice it only matches the first pattern that fits.

Replace can also work at various levels of an expression:

 Replace[{1, 2, "3", 2, 1},
  i_Integer :> ("int " <> ToString@i),
  1]
 {"int 1", "int 2", "3", "int 2", "int 1"}

ReplaceAll

ReplaceAll is the only other member of the family I’ll mention here. It works similarly to Replace , except the replacements can happen at any level of the expression. This is dangerous, but also useful.

Also useful is the fact that it has a keyboard alias: /.

Here’s a fun example:

 GraphicsGrid[
  Table[
     Table[RandomInteger[100],
       {j, RandomInteger[{1, 6}]}],
     {i, RandomInteger[{3, 5}]}
     ] /. 
  i_Integer :> Graphics[{RandomColor[], Disk[]}, ImageSize -> i],
  Spacings -> 0
  ]
21-2242955263637576379

Replace⋆

The rest of this family share the name Replace⋆ and most of them work quite like Replace , with the notable exception of ReplacePart