Mercurial supports the ** syntax extension; it matches any string across path separators while * does not.

An Example in PowerShell:

PS C:\hg> hg init my-repo
PS C:\hg> cd .\my-repo
PS C:\hg\my-repo> New-Item file1.txt -type file

    Directory: C:\hg\my-repo

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        10/16/2012  11:40 AM          0 file1.txt

PS C:\hg\my-repo> New-Item file2.txt -type file

    Directory: C:\hg\my-repo

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        10/16/2012  11:40 AM          0 file2.txt

PS C:\hg\my-repo> hg st
? file1.txt
? file2.txt
PS C:\hg\my-repo> hg add --exclude "**2**" # This will not add file2.txt
adding file1.txt
PS C:\hg\my-repo> hg add --exclude "*2*" # This will also not add file2.txt, because we are in the same directory!
PS C:\hg\my-repo> # Create another directory...
PS C:\hg\my-repo> New-Item my-subdirectory -type directory

    Directory: C:\hg\my-repo

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        10/16/2012  11:45 AM            my-subdirectory

PS C:\hg\my-repo> cd .\my-subdirectory
PS C:\hg\my-repo\my-subdirectory> hg add --exclude "*2*" # This will add file2.txt. The pattern does not match because
we are NOT in the same directory!
adding ..\file2.txt
PS C:\hg\my-repo\my-subdirectory> hg st
A file1.txt
A file2.txt
PS C:\hg\my-repo\my-subdirectory>