diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
 Usage
 -----
 
-Cgrep 6.4.16 Usage: cgrep [OPTION] [PATTERN] files...
+Cgrep 6.4.17 Usage: cgrep [OPTION] [PATTERN] files...
 
 cgrep [OPTIONS] [ITEM]
 
diff --git a/cgrep.cabal b/cgrep.cabal
--- a/cgrep.cabal
+++ b/cgrep.cabal
@@ -1,6 +1,6 @@
 Name:                cgrep
 Description:         Cgrep: a context-aware grep for source codes
-Version:             6.4.16
+Version:             6.4.17
 Synopsis:            Command line tool
 Homepage:            http://awgn.github.io/cgrep/
 License:             GPL-2
diff --git a/src/CGrep/Semantic/WildCard.hs b/src/CGrep/Semantic/WildCard.hs
--- a/src/CGrep/Semantic/WildCard.hs
+++ b/src/CGrep/Semantic/WildCard.hs
@@ -19,6 +19,8 @@
 module CGrep.Semantic.WildCard (WildCard(..), MultiCard,
                                 filterTokensWithMultiCards,
                                 wildCardMatch,
+                                isWildCardPattern,
+                                rmWildCardEscape,
                                 multiCardMatch) where
 
 import qualified Data.Map as M
@@ -79,6 +81,22 @@
         where ts = multiCardGroupCompare opt l r
 
 
+isWildCardPattern :: String -> Bool
+isWildCardPattern s =
+    case () of
+        _ | (x:y:_) <- s   -> wprefix x && not (wprefix y)
+          | [x]     <- s   -> wprefix x
+          | otherwise     -> error "isWildCardPattern"
+    where wprefix x = x == '$' || x == '_'
+
+
+rmWildCardEscape :: String -> String
+rmWildCardEscape ('$':'_':xs) = '_' : xs
+rmWildCardEscape ('_':'_':xs) = '_' : xs
+rmWildCardEscape ('$':'$':xs) = '$' : xs
+rmWildCardEscape xs = xs
+
+
 {-# INLINE multiCardCompareAll #-}
 
 multiCardCompareAll :: [(Bool, (MultiCard a, [String]))] -> Bool
@@ -127,7 +145,7 @@
 tokensZip :: (SemanticToken a) => Options -> MultiCard a -> a -> (Bool, (MultiCard a, [String]))
 tokensZip opt l r
     |  multiCardMatch opt l r = (True,  (l, [tkToString r]))
-    |  otherwise             =  (False, ([AnyCard],[] ))
+    |  otherwise              =  (False, ([AnyCard],[] ))
 
 
 multiCardMatch :: (SemanticToken t) => Options ->  MultiCard t -> t -> Bool
diff --git a/src/CGrep/Strategy/Cpp/Semantic.hs b/src/CGrep/Strategy/Cpp/Semantic.hs
--- a/src/CGrep/Strategy/Cpp/Semantic.hs
+++ b/src/CGrep/Strategy/Cpp/Semantic.hs
@@ -55,10 +55,8 @@
     -- pre-process patterns
 
         patterns   = map (Cpp.tokenizer . contextFilter (Just Cpp) filt) ps  -- [ [t1,t2,..], [t1,t2...] ]
-
-        patterns'  = map (map mkWildCard) patterns                 -- [ [w1,w2,..], [w1,w2,..] ]
-
-        patterns'' = map (combineMultiCard . map (:[])) patterns'  -- [ [m1,m2,..], [m1,m2,..] ] == [ [ [w1], [w2],..], [[w1],[w2],..]]
+        patterns'  = map (map mkWildCard) patterns                           -- [ [w1,w2,..], [w1,w2,..] ]
+        patterns'' = map (combineMultiCard . map (:[])) patterns'            -- [ [m1,m2,..], [m1,m2,..] ] == [ [ [w1], [w2],..], [[w1],[w2],..]]
 
     -- quick Search...
 
@@ -130,14 +128,12 @@
                 ("LIT", LiteralCard )
             ]
 
-
 mkWildCard :: Cpp.Token -> WildCard Cpp.Token
-mkWildCard t@(Cpp.TokenIdentifier s _) =
+mkWildCard t@(Cpp.TokenIdentifier s off) =
     case () of
         _  |  Just wc <-  M.lookup str wildCardMap -> wc
-           | ('$':_)  <- s             -> IdentifCard str
-           | ('_':_)  <- s             -> IdentifCard str
-           | otherwise                 -> TokenCard t
+           | isWildCardPattern s -> IdentifCard str
+           | otherwise           -> TokenCard $ Cpp.TokenIdentifier (rmWildCardEscape s) off
     where str = tkToString t
 mkWildCard t = TokenCard t
 
@@ -145,9 +141,9 @@
 combineMultiCard :: [MultiCard Cpp.Token] -> [MultiCard Cpp.Token]
 combineMultiCard (m1:r@(m2:m3:ms))
     | [TokenCard (Cpp.TokenIdentifier {Cpp.toString = "OR"})] <- m2 =  combineMultiCard $ (m1++m3):ms
-    | otherwise             =  m1 : combineMultiCard r
-combineMultiCard [m1,m2]    =  [m1,m2]
-combineMultiCard [m1]       =  [m1]
-combineMultiCard []         =  []
+    | otherwise          =  m1 : combineMultiCard r
+combineMultiCard [m1,m2] =  [m1,m2]
+combineMultiCard [m1]    =  [m1]
+combineMultiCard []      =  []
 
 
diff --git a/src/CGrep/Strategy/Generic/Semantic.hs b/src/CGrep/Strategy/Generic/Semantic.hs
--- a/src/CGrep/Strategy/Generic/Semantic.hs
+++ b/src/CGrep/Strategy/Generic/Semantic.hs
@@ -120,12 +120,11 @@
 
 
 mkWildCard :: Generic.Token -> WildCard Generic.Token
-mkWildCard t@(Generic.TokenAlpha s _) =
+mkWildCard t@(Generic.TokenAlpha s off) =
     case () of
         _  |  Just wc <-  M.lookup str wildCardMap -> wc
-           | ('$':_)  <- s             -> IdentifCard str
-           | ('_':_)  <- s             -> IdentifCard str
-           | otherwise                 -> TokenCard t
+           | isWildCardPattern s -> IdentifCard str
+           | otherwise           -> TokenCard $ Generic.TokenAlpha (rmWildCardEscape s) off
     where str = tkToString t
 mkWildCard t = TokenCard t
 
@@ -133,9 +132,9 @@
 combineMultiCard :: [MultiCard Generic.Token] -> [MultiCard Generic.Token]
 combineMultiCard (m1:r@(m2:m3:ms))
     | [TokenCard (Generic.TokenAlpha {Generic.toString = "OR"})] <- m2 =  combineMultiCard $ (m1++m3):ms
-    | otherwise             =  m1 : combineMultiCard r
-combineMultiCard [m1,m2]    =  [m1,m2]
-combineMultiCard [m1]       =  [m1]
-combineMultiCard []         =  []
+    | otherwise          =  m1 : combineMultiCard r
+combineMultiCard [m1,m2] =  [m1,m2]
+combineMultiCard [m1]    =  [m1]
+combineMultiCard []      =  []
 
 
diff --git a/src/Config.hs b/src/Config.hs
--- a/src/Config.hs
+++ b/src/Config.hs
@@ -31,7 +31,7 @@
 cgreprc = "cgreprc"
 
 version :: String
-version = "6.4.16"
+version = "6.4.17"
 
 
 data Config = Config
