Title here
Summary here
Our first program demonstrates the use of regular expressions in Haskell. Here’s the full source code:
import Text.Regex.PCRE
import qualified Data.ByteString.Char8 as B
main :: IO ()
main = do
-- This tests whether a pattern matches a string.
let match = "peach" =~ "p([a-z]+)ch" :: Bool
print match
-- For other regex tasks, we'll use the compiled Regex.
let r = makeRegex "p([a-z]+)ch" :: Regex
-- Here's a match test like we saw earlier.
print $ match r "peach"
-- This finds the match for the regex.
print $ match r "peach punch"
-- This also finds the first match but returns the
-- start and end indexes for the match instead of the
-- matching text.
print $ "idx:" ++ show (matchOnce r "peach punch")
-- The getAllTextMatches function includes information about
-- both the whole-pattern matches and the submatches
-- within those matches.
print $ getAllTextMatches (r =~ "peach punch" :: AllTextMatches [] String)
-- Similarly, this will return information about the
-- indexes of matches and submatches.
print $ getAllMatches (r =~ "peach punch" :: AllMatches [] (MatchOffset, MatchLength))
-- To find all matches for a regex:
print $ getAllTextMatches (r =~ "peach punch pinch" :: AllTextMatches [] String)
-- Providing a non-negative integer as the second
-- argument to these functions will limit the number
-- of matches.
print $ take 2 $ getAllTextMatches (r =~ "peach punch pinch" :: AllTextMatches [] String)
-- We can also provide ByteString arguments
print $ match r (B.pack "peach")
-- When creating global variables with regular
-- expressions, you can use the makeRegexOpts function
-- for more control over compilation.
let r' = makeRegexOpts compCaseless execBlank "p([a-z]+)ch" :: Regex
print $ "regex:" ++ show r'
-- The regex package can also be used to replace
-- subsets of strings with other values.
print $ subRegex r "a peach" "<fruit>"
-- The second argument to subRegex allows you to transform
-- matched text with a given function.
let toUpper = map (\c -> if c >= 'a' && c <= 'z' then toEnum (fromEnum c - 32) else c)
print $ subRegex r "a peach" (toUpper . head . getAllTextMatches)
To run the program, save the code in a file (e.g., RegexExample.hs
) and use runghc
:
$ runghc RegexExample.hs
True
True
True
"idx:Just (0,5)"
["peach","ea"]
[(0,5),(1,2)]
["peach","punch","pinch"]
["peach","punch"]
True
"regex:Regex {}"
"a <fruit>"
"a PEACH"
This example demonstrates various regex operations in Haskell using the regex-pcre
library. Note that Haskell’s regex functionality is provided through libraries, and the exact API might differ depending on the library used. The regex-pcre
library is chosen here for its similarity to the Go example’s functionality.
For a complete reference on Haskell regular expressions, check the documentation of the regex library you’re using, such as regex-pcre
or regex-tdfa
.