diff --git a/bytestringparser-temporary.cabal b/bytestringparser-temporary.cabal
--- a/bytestringparser-temporary.cabal
+++ b/bytestringparser-temporary.cabal
@@ -1,5 +1,5 @@
 name:            bytestringparser-temporary
-version:         0.0.0
+version:         0.1.0
 license:         BSD3
 license-file:    LICENSE
 category:        Text, Parsing
diff --git a/src/Data/ParserCombinators/Attoparsec/Char8.hs b/src/Data/ParserCombinators/Attoparsec/Char8.hs
--- a/src/Data/ParserCombinators/Attoparsec/Char8.hs
+++ b/src/Data/ParserCombinators/Attoparsec/Char8.hs
@@ -30,6 +30,7 @@
     , try
     , manyTill
     , eof
+    , notFollowedBy
     , skipMany
     , skipMany1
     , count
@@ -78,7 +79,7 @@
 import Data.ParserCombinators.Attoparsec.Internal
     (Parser, ParseError, (<?>), parse, parseAt, parseTest, try, manyTill, eof,
      skipMany, skipMany1, count, lookAhead, peek, sepBy, sepBy1, string,
-     eitherP, getInput, getConsumed, takeAll, notEmpty, match)
+     eitherP, getInput, getConsumed, takeAll, notEmpty, match, notFollowedBy)
 import Prelude hiding (takeWhile)
 
 -- | Character parser.
diff --git a/src/Data/ParserCombinators/Attoparsec/Internal.hs b/src/Data/ParserCombinators/Attoparsec/Internal.hs
--- a/src/Data/ParserCombinators/Attoparsec/Internal.hs
+++ b/src/Data/ParserCombinators/Attoparsec/Internal.hs
@@ -30,6 +30,7 @@
     , try
     , manyTill
     , eof
+    , notFollowedBy
     , skipMany
     , skipMany1
     , count
@@ -239,6 +240,12 @@
 eof = Parser $ \s@(S sb lb _) -> if SB.null sb && LB.null lb
                                  then Right ((), s)
                                  else Left (sb +: lb, ["EOF"])
+
+notFollowedBy :: Parser a -> Parser ()
+notFollowedBy p = Parser $ \s@(S sb lb _) ->
+                  case unParser p s of
+                    Left (_, msgs) -> Right ((), s)
+                    ok -> Left (sb +: lb, [])
 
 takeAll :: Parser LB.ByteString
 takeAll = Parser $ \(S sb lb n) ->
