/usr/share/doc/libghc-regex-compat-tdfa-doc/html/src/Text-Regex.html is in libghc-regex-compat-tdfa-doc 0.95.1.4-5build2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 | <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>Text/Regex.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# OPTIONS_GHC -fno-warn-name-shadowing #-}</span>
<a name="line-2"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-3"></a><span class='hs-comment'>-- |</span>
<a name="line-4"></a><span class='hs-comment'>-- Module : Text.Regex</span>
<a name="line-5"></a><span class='hs-comment'>-- Copyright : (c) Chris Kuklewicz 2006, (c) shelarcy 2012, derived from (c) The University of Glasgow 2001</span>
<a name="line-6"></a><span class='hs-comment'>-- License : BSD-style (see the file LICENSE)</span>
<a name="line-7"></a><span class='hs-comment'>-- </span>
<a name="line-8"></a><span class='hs-comment'>-- Maintainer : libraries@haskell.org</span>
<a name="line-9"></a><span class='hs-comment'>-- Stability : experimental</span>
<a name="line-10"></a><span class='hs-comment'>-- Portability : non-portable (regex-base needs MPTC+FD)</span>
<a name="line-11"></a><span class='hs-comment'>--</span>
<a name="line-12"></a><span class='hs-comment'>-- Regular expression matching. Uses the POSIX regular expression</span>
<a name="line-13"></a><span class='hs-comment'>-- interface in "Text.Regex.TDFA".</span>
<a name="line-14"></a><span class='hs-comment'>--</span>
<a name="line-15"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-16"></a>
<a name="line-17"></a><span class='hs-comment'>--</span>
<a name="line-18"></a><span class='hs-comment'>-- Modified by Chris Kuklewicz to be a thin layer over the regex-posix</span>
<a name="line-19"></a><span class='hs-comment'>-- package, and moved into a regex-compat package.</span>
<a name="line-20"></a><span class='hs-comment'>--</span>
<a name="line-21"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Regex</span> <span class='hs-layout'>(</span>
<a name="line-22"></a> <span class='hs-comment'>-- * Regular expressions</span>
<a name="line-23"></a> <span class='hs-conid'>Regex</span><span class='hs-layout'>,</span>
<a name="line-24"></a> <span class='hs-varid'>mkRegex</span><span class='hs-layout'>,</span>
<a name="line-25"></a> <span class='hs-varid'>mkRegexWithOpts</span><span class='hs-layout'>,</span>
<a name="line-26"></a> <span class='hs-varid'>matchRegex</span><span class='hs-layout'>,</span>
<a name="line-27"></a> <span class='hs-varid'>matchRegexAll</span><span class='hs-layout'>,</span>
<a name="line-28"></a> <span class='hs-varid'>subRegex</span><span class='hs-layout'>,</span>
<a name="line-29"></a> <span class='hs-varid'>splitRegex</span>
<a name="line-30"></a> <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-31"></a>
<a name="line-32"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Array</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>!</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-33"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Regex</span><span class='hs-varop'>.</span><span class='hs-conid'>Base</span><span class='hs-layout'>(</span><span class='hs-conid'>RegexMaker</span><span class='hs-layout'>(</span><span class='hs-varid'>makeRegexOpts</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>defaultCompOpt</span><span class='hs-layout'>,</span><span class='hs-varid'>defaultExecOpt</span><span class='hs-layout'>,</span><span class='hs-conid'>RegexLike</span><span class='hs-layout'>(</span><span class='hs-varid'>matchAll</span><span class='hs-layout'>,</span><span class='hs-varid'>matchAllText</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-conid'>RegexContext</span><span class='hs-layout'>(</span><span class='hs-varid'>matchM</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-conid'>MatchText</span><span class='hs-layout'>)</span>
<a name="line-34"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Regex</span><span class='hs-varop'>.</span><span class='hs-conid'>TDFA</span><span class='hs-layout'>(</span><span class='hs-conid'>Regex</span><span class='hs-layout'>,</span><span class='hs-varid'>caseSensitive</span><span class='hs-layout'>,</span><span class='hs-varid'>multiline</span><span class='hs-layout'>,</span><span class='hs-varid'>newSyntax</span><span class='hs-layout'>)</span>
<a name="line-35"></a>
<a name="line-36"></a><a name="mkRegex"></a><span class='hs-comment'>-- | Makes a regular expression with the default options (multi-line,</span>
<a name="line-37"></a><span class='hs-comment'>-- case-sensitive). The syntax of regular expressions is</span>
<a name="line-38"></a><span class='hs-comment'>-- otherwise that of @egrep@ (i.e. POSIX \"extended\" regular</span>
<a name="line-39"></a><span class='hs-comment'>-- expressions).</span>
<a name="line-40"></a><span class='hs-definition'>mkRegex</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Regex</span>
<a name="line-41"></a><span class='hs-definition'>mkRegex</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>makeRegexOpts</span> <span class='hs-varid'>opt</span> <span class='hs-varid'>defaultExecOpt</span> <span class='hs-varid'>s</span>
<a name="line-42"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>opt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>defaultCompOpt</span> <span class='hs-layout'>{</span> <span class='hs-varid'>newSyntax</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span><span class='hs-layout'>,</span> <span class='hs-varid'>multiline</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <span class='hs-layout'>}</span>
<a name="line-43"></a>
<a name="line-44"></a><a name="mkRegexWithOpts"></a><span class='hs-comment'>-- | Makes a regular expression, where the multi-line and</span>
<a name="line-45"></a><span class='hs-comment'>-- case-sensitive options can be changed from the default settings.</span>
<a name="line-46"></a><span class='hs-definition'>mkRegexWithOpts</span>
<a name="line-47"></a> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-comment'>-- ^ The regular expression to compile</span>
<a name="line-48"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <span class='hs-comment'>-- ^ 'True' @\<=>@ @\'^\'@ and @\'$\'@ match the beginning and </span>
<a name="line-49"></a> <span class='hs-comment'>-- end of individual lines respectively, and @\'.\'@ does /not/</span>
<a name="line-50"></a> <span class='hs-comment'>-- match the newline character.</span>
<a name="line-51"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <span class='hs-comment'>-- ^ 'True' @\<=>@ matching is case-sensitive</span>
<a name="line-52"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Regex</span> <span class='hs-comment'>-- ^ Returns: the compiled regular expression</span>
<a name="line-53"></a>
<a name="line-54"></a><span class='hs-definition'>mkRegexWithOpts</span> <span class='hs-varid'>s</span> <span class='hs-varid'>single_line</span> <span class='hs-varid'>case_sensitive</span>
<a name="line-55"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>opt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>defaultCompOpt</span>
<a name="line-56"></a> <span class='hs-layout'>{</span> <span class='hs-varid'>multiline</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-keyword'>if</span> <span class='hs-varid'>single_line</span> <span class='hs-keyword'>then</span> <span class='hs-conid'>True</span> <span class='hs-keyword'>else</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span>
<a name="line-57"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>caseSensitive</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-keyword'>if</span> <span class='hs-varid'>case_sensitive</span> <span class='hs-keyword'>then</span> <span class='hs-conid'>True</span> <span class='hs-keyword'>else</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span>
<a name="line-58"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>newSyntax</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <span class='hs-layout'>}</span>
<a name="line-59"></a> <span class='hs-keyword'>in</span> <span class='hs-varid'>makeRegexOpts</span> <span class='hs-varid'>opt</span> <span class='hs-varid'>defaultExecOpt</span> <span class='hs-varid'>s</span>
<a name="line-60"></a>
<a name="line-61"></a><a name="matchRegex"></a><span class='hs-comment'>-- | Match a regular expression against a string</span>
<a name="line-62"></a><span class='hs-definition'>matchRegex</span>
<a name="line-63"></a> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Regex</span> <span class='hs-comment'>-- ^ The regular expression</span>
<a name="line-64"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <span class='hs-comment'>-- ^ The string to match against</span>
<a name="line-65"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- ^ Returns: @'Just' strs@ if the match succeeded</span>
<a name="line-66"></a> <span class='hs-comment'>-- (and @strs@ is the list of subexpression matches),</span>
<a name="line-67"></a> <span class='hs-comment'>-- or 'Nothing' otherwise.</span>
<a name="line-68"></a><span class='hs-definition'>matchRegex</span> <span class='hs-varid'>p</span> <span class='hs-varid'>str</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-varid'>str</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>matchRegexAll</span> <span class='hs-varid'>p</span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span>
<a name="line-69"></a>
<a name="line-70"></a><a name="matchRegexAll"></a><span class='hs-comment'>-- | Match a regular expression against a string, returning more information</span>
<a name="line-71"></a><span class='hs-comment'>-- about the match.</span>
<a name="line-72"></a><span class='hs-definition'>matchRegexAll</span>
<a name="line-73"></a> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Regex</span> <span class='hs-comment'>-- ^ The regular expression</span>
<a name="line-74"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <span class='hs-comment'>-- ^ The string to match against</span>
<a name="line-75"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span> <span class='hs-conid'>String</span><span class='hs-layout'>,</span> <span class='hs-conid'>String</span><span class='hs-layout'>,</span> <span class='hs-conid'>String</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>)</span>
<a name="line-76"></a> <span class='hs-comment'>-- ^ Returns: 'Nothing' if the match failed, or:</span>
<a name="line-77"></a> <span class='hs-comment'>-- </span>
<a name="line-78"></a> <span class='hs-comment'>-- > Just ( everything before match,</span>
<a name="line-79"></a> <span class='hs-comment'>-- > portion matched,</span>
<a name="line-80"></a> <span class='hs-comment'>-- > everything after the match,</span>
<a name="line-81"></a> <span class='hs-comment'>-- > subexpression matches )</span>
<a name="line-82"></a>
<a name="line-83"></a><span class='hs-definition'>matchRegexAll</span> <span class='hs-varid'>p</span> <span class='hs-varid'>str</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>matchM</span> <span class='hs-varid'>p</span> <span class='hs-varid'>str</span>
<a name="line-84"></a>
<a name="line-85"></a><span class='hs-comment'>{- | Replaces every occurance of the given regexp with the replacement string.
<a name="line-86"></a>
<a name="line-87"></a>In the replacement string, @\"\\1\"@ refers to the first substring;
<a name="line-88"></a>@\"\\2\"@ to the second, etc; and @\"\\0\"@ to the entire match.
<a name="line-89"></a>@\"\\\\\\\\\"@ will insert a literal backslash.
<a name="line-90"></a>
<a name="line-91"></a>This does not advance if the regex matches an empty string. This
<a name="line-92"></a>misfeature is here to match the behavior of the the original
<a name="line-93"></a>Text.Regex API.
<a name="line-94"></a>-}</span>
<a name="line-95"></a>
<a name="line-96"></a><a name="subRegex"></a><span class='hs-definition'>subRegex</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Regex</span> <span class='hs-comment'>-- ^ Search pattern</span>
<a name="line-97"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <span class='hs-comment'>-- ^ Input string</span>
<a name="line-98"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <span class='hs-comment'>-- ^ Replacement text</span>
<a name="line-99"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <span class='hs-comment'>-- ^ Output string</span>
<a name="line-100"></a><span class='hs-definition'>subRegex</span> <span class='hs-keyword'>_</span> <span class='hs-str'>""</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>""</span>
<a name="line-101"></a><span class='hs-definition'>subRegex</span> <span class='hs-varid'>regexp</span> <span class='hs-varid'>inp</span> <span class='hs-varid'>repl</span> <span class='hs-keyglyph'>=</span>
<a name="line-102"></a> <span class='hs-keyword'>let</span> <span class='hs-varid'>compile</span> <span class='hs-sel'>_i</span> <span class='hs-varid'>str</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span> <span class='hs-sel'>_m</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>str</span><span class='hs-varop'>++</span><span class='hs-layout'>)</span>
<a name="line-103"></a> <span class='hs-varid'>compile</span> <span class='hs-varid'>i</span> <span class='hs-varid'>str</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-str'>"\\"</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-varid'>off</span><span class='hs-layout'>,</span><span class='hs-varid'>len</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-104"></a> <span class='hs-keyword'>let</span> <span class='hs-varid'>i'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>off</span><span class='hs-varop'>+</span><span class='hs-varid'>len</span>
<a name="line-105"></a> <span class='hs-varid'>pre</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>take</span> <span class='hs-layout'>(</span><span class='hs-varid'>off</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>str</span>
<a name="line-106"></a> <span class='hs-varid'>str'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>drop</span> <span class='hs-layout'>(</span><span class='hs-varid'>i'</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>str</span>
<a name="line-107"></a> <span class='hs-keyword'>in</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>null</span> <span class='hs-varid'>str'</span> <span class='hs-keyword'>then</span> <span class='hs-keyglyph'>\</span> <span class='hs-sel'>_m</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>pre</span> <span class='hs-varop'>++</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-layout'>(</span><span class='hs-chr'>'\\'</span><span class='hs-conop'>:</span><span class='hs-layout'>)</span>
<a name="line-108"></a> <span class='hs-keyword'>else</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>pre</span> <span class='hs-varop'>++</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-layout'>(</span><span class='hs-chr'>'\\'</span> <span class='hs-conop'>:</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>compile</span> <span class='hs-varid'>i'</span> <span class='hs-varid'>str'</span> <span class='hs-varid'>rest</span> <span class='hs-varid'>m</span>
<a name="line-109"></a> <span class='hs-varid'>compile</span> <span class='hs-varid'>i</span> <span class='hs-varid'>str</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>xstr</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-varid'>off</span><span class='hs-layout'>,</span><span class='hs-varid'>len</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-110"></a> <span class='hs-keyword'>let</span> <span class='hs-varid'>i'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>off</span><span class='hs-varop'>+</span><span class='hs-varid'>len</span>
<a name="line-111"></a> <span class='hs-varid'>pre</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>take</span> <span class='hs-layout'>(</span><span class='hs-varid'>off</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>str</span>
<a name="line-112"></a> <span class='hs-varid'>str'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>drop</span> <span class='hs-layout'>(</span><span class='hs-varid'>i'</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>str</span>
<a name="line-113"></a> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>read</span> <span class='hs-varid'>xstr</span>
<a name="line-114"></a> <span class='hs-keyword'>in</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>null</span> <span class='hs-varid'>str'</span> <span class='hs-keyword'>then</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>pre</span><span class='hs-varop'>++</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>fst</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-varop'>!</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-varop'>++</span><span class='hs-layout'>)</span>
<a name="line-115"></a> <span class='hs-keyword'>else</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>pre</span><span class='hs-varop'>++</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>fst</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-varop'>!</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-varop'>++</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>compile</span> <span class='hs-varid'>i'</span> <span class='hs-varid'>str'</span> <span class='hs-varid'>rest</span> <span class='hs-varid'>m</span>
<a name="line-116"></a> <span class='hs-varid'>compiled</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MatchText</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span>
<a name="line-117"></a> <span class='hs-varid'>compiled</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compile</span> <span class='hs-num'>0</span> <span class='hs-varid'>repl</span> <span class='hs-varid'>findrefs</span> <span class='hs-keyword'>where</span>
<a name="line-118"></a> <span class='hs-comment'>-- bre matches a backslash then capture either a backslash or some digits</span>
<a name="line-119"></a> <span class='hs-varid'>bre</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkRegex</span> <span class='hs-str'>"\\\\(\\\\|[0-9]+)"</span>
<a name="line-120"></a> <span class='hs-varid'>findrefs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>m</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>fst</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-varop'>!</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>snd</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-varop'>!</span><span class='hs-num'>0</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>matchAllText</span> <span class='hs-varid'>bre</span> <span class='hs-varid'>repl</span><span class='hs-layout'>)</span>
<a name="line-121"></a> <span class='hs-varid'>go</span> <span class='hs-sel'>_i</span> <span class='hs-varid'>str</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>str</span>
<a name="line-122"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>i</span> <span class='hs-varid'>str</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-conop'>:</span><span class='hs-varid'>ms</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-123"></a> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-varid'>off</span><span class='hs-layout'>,</span><span class='hs-varid'>len</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>m</span><span class='hs-varop'>!</span><span class='hs-num'>0</span>
<a name="line-124"></a> <span class='hs-varid'>i'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>off</span><span class='hs-varop'>+</span><span class='hs-varid'>len</span>
<a name="line-125"></a> <span class='hs-varid'>pre</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>take</span> <span class='hs-layout'>(</span><span class='hs-varid'>off</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>str</span>
<a name="line-126"></a> <span class='hs-varid'>str'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>drop</span> <span class='hs-layout'>(</span><span class='hs-varid'>i'</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>str</span>
<a name="line-127"></a> <span class='hs-keyword'>in</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>null</span> <span class='hs-varid'>str'</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>pre</span> <span class='hs-varop'>++</span> <span class='hs-layout'>(</span><span class='hs-varid'>compiled</span> <span class='hs-varid'>m</span> <span class='hs-str'>""</span><span class='hs-layout'>)</span>
<a name="line-128"></a> <span class='hs-keyword'>else</span> <span class='hs-varid'>pre</span> <span class='hs-varop'>++</span> <span class='hs-layout'>(</span><span class='hs-varid'>compiled</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>i'</span> <span class='hs-varid'>str'</span> <span class='hs-varid'>ms</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-129"></a> <span class='hs-keyword'>in</span> <span class='hs-varid'>go</span> <span class='hs-num'>0</span> <span class='hs-varid'>inp</span> <span class='hs-layout'>(</span><span class='hs-varid'>matchAllText</span> <span class='hs-varid'>regexp</span> <span class='hs-varid'>inp</span><span class='hs-layout'>)</span>
<a name="line-130"></a>
<a name="line-131"></a><span class='hs-comment'>{- | Splits a string based on a regular expression. The regular expression
<a name="line-132"></a>should identify one delimiter.
<a name="line-133"></a>
<a name="line-134"></a>This does not advance and produces an infinite list of [] if the regex
<a name="line-135"></a>matches an empty string. This misfeature is here to match the
<a name="line-136"></a>behavior of the the original Text.Regex API.
<a name="line-137"></a>-}</span>
<a name="line-138"></a>
<a name="line-139"></a><a name="splitRegex"></a><span class='hs-definition'>splitRegex</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Regex</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-140"></a><span class='hs-definition'>splitRegex</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-141"></a><span class='hs-definition'>splitRegex</span> <span class='hs-varid'>delim</span> <span class='hs-varid'>strIn</span> <span class='hs-keyglyph'>=</span>
<a name="line-142"></a> <span class='hs-keyword'>let</span> <span class='hs-varid'>matches</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varop'>!</span><span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>matchAll</span> <span class='hs-varid'>delim</span> <span class='hs-varid'>strIn</span><span class='hs-layout'>)</span>
<a name="line-143"></a> <span class='hs-varid'>go</span> <span class='hs-sel'>_i</span> <span class='hs-varid'>str</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>str</span> <span class='hs-conop'>:</span> <span class='hs-conid'>[]</span>
<a name="line-144"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>i</span> <span class='hs-varid'>str</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>off</span><span class='hs-layout'>,</span><span class='hs-varid'>len</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-145"></a> <span class='hs-keyword'>let</span> <span class='hs-varid'>i'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>off</span><span class='hs-varop'>+</span><span class='hs-varid'>len</span>
<a name="line-146"></a> <span class='hs-varid'>firstline</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>take</span> <span class='hs-layout'>(</span><span class='hs-varid'>off</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>str</span>
<a name="line-147"></a> <span class='hs-varid'>remainder</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>drop</span> <span class='hs-layout'>(</span><span class='hs-varid'>i'</span><span class='hs-comment'>-</span><span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>str</span>
<a name="line-148"></a> <span class='hs-keyword'>in</span> <span class='hs-varid'>seq</span> <span class='hs-varid'>i'</span> <span class='hs-varop'>$</span>
<a name="line-149"></a> <span class='hs-keyword'>if</span> <span class='hs-varid'>null</span> <span class='hs-varid'>remainder</span> <span class='hs-keyword'>then</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>firstline</span><span class='hs-layout'>,</span><span class='hs-str'>""</span><span class='hs-keyglyph'>]</span>
<a name="line-150"></a> <span class='hs-keyword'>else</span> <span class='hs-varid'>firstline</span> <span class='hs-conop'>:</span> <span class='hs-varid'>go</span> <span class='hs-varid'>i'</span> <span class='hs-varid'>remainder</span> <span class='hs-varid'>rest</span>
<a name="line-151"></a> <span class='hs-keyword'>in</span> <span class='hs-varid'>go</span> <span class='hs-num'>0</span> <span class='hs-varid'>strIn</span> <span class='hs-varid'>matches</span>
<a name="line-152"></a>
<a name="line-153"></a><span class='hs-comment'>{-
<a name="line-154"></a>
<a name="line-155"></a>-- These are the older versions which failed on (correct answer:)
<a name="line-156"></a>-- let r = mkRegex "^(.)" in subRegex2 r "abc\ndef" "|\\1"
<a name="line-157"></a>-- "|abc\n|def"
<a name="line-158"></a>
<a name="line-159"></a>subRegex :: Regex -- ^ Search pattern
<a name="line-160"></a> -> String -- ^ Input string
<a name="line-161"></a> -> String -- ^ Replacement text
<a name="line-162"></a> -> String -- ^ Output string
<a name="line-163"></a>subRegex _ "" _ = ""
<a name="line-164"></a>subRegex regexp inp repl =
<a name="line-165"></a> let -- bre matches a backslash then capture either a backslash or some digits
<a name="line-166"></a> bre = mkRegex "\\\\(\\\\|[0-9]+)"
<a name="line-167"></a> lookup _ [] _ = []
<a name="line-168"></a> lookup [] _ _ = []
<a name="line-169"></a> lookup match repl groups =
<a name="line-170"></a> case matchRegexAll bre repl of
<a name="line-171"></a> Nothing -> repl
<a name="line-172"></a> Just (lead, _, trail, bgroups) ->
<a name="line-173"></a> let newval =
<a name="line-174"></a> if (head bgroups) == "\\"
<a name="line-175"></a> then "\\"
<a name="line-176"></a> else let index :: Int
<a name="line-177"></a> index = (read (head bgroups)) - 1
<a name="line-178"></a> in if index == -1
<a name="line-179"></a> then match
<a name="line-180"></a> else groups !! index
<a name="line-181"></a> in lead ++ newval ++ lookup match trail groups
<a name="line-182"></a> in case matchRegexAll regexp inp of
<a name="line-183"></a> Nothing -> inp
<a name="line-184"></a> Just (lead, match, trail, groups) ->
<a name="line-185"></a> lead ++ lookup match repl groups ++ (subRegex regexp trail repl)
<a name="line-186"></a>
<a name="line-187"></a>splitRegex :: Regex -> String -> [String]
<a name="line-188"></a>splitRegex _ [] = []
<a name="line-189"></a>splitRegex delim strIn = loop strIn where
<a name="line-190"></a> loop str = case matchOnceText delim str of
<a name="line-191"></a> Nothing -> [str]
<a name="line-192"></a> Just (firstline, _, remainder) ->
<a name="line-193"></a> if null remainder
<a name="line-194"></a> then [firstline,""]
<a name="line-195"></a> else firstline : loop remainder
<a name="line-196"></a>
<a name="line-197"></a>-}</span>
</pre></body>
</html>
|