Skip to content

Commit 5898fb2

Browse files
committed
Merge pull request #49 from sharkdp/handle-regex-syntax-errors
Handle Regex syntax errors, resolves #48
2 parents 07a8f76 + 85f08d3 commit 5898fb2

File tree

5 files changed

+44
-21
lines changed

5 files changed

+44
-21
lines changed

bower.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
"package.json"
2020
],
2121
"dependencies": {
22-
"purescript-maybe": "^0.3.0"
22+
"purescript-maybe": "^0.3.0",
23+
"purescript-either": "^0.2.0"
2324
},
2425
"devDependencies": {
2526
"purescript-assert": "~0.1.0",

docs/Data/String/Regex.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,11 @@ All flags set to false.
3636
#### `regex`
3737

3838
``` purescript
39-
regex :: String -> RegexFlags -> Regex
39+
regex :: String -> RegexFlags -> Either String Regex
4040
```
4141

42-
Constructs a `Regex` from a pattern string and flags.
42+
Constructs a `Regex` from a pattern string and flags. Fails with
43+
`Left error` if the pattern contains a syntax error.
4344

4445
#### `source`
4546

src/Data/String/Regex.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,17 @@ exports["showRegex'"] = function (r) {
77
return "" + r;
88
};
99

10-
exports["regex'"] = function (s1) {
11-
return function (s2) {
12-
return new RegExp(s1, s2);
10+
exports["regex'"] = function (left) {
11+
return function (right) {
12+
return function (s1) {
13+
return function (s2) {
14+
try {
15+
return right(new RegExp(s1, s2));
16+
} catch (e) {
17+
return left(e.message);
18+
}
19+
};
20+
};
1321
};
1422
};
1523

src/Data/String/Regex.purs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ module Data.String.Regex
2020

2121
import Prelude
2222
import Data.Maybe (Maybe(..))
23+
import Data.Either (Either(..))
2324
import Data.String (contains)
2425

2526
-- | Wraps Javascript `RegExp` objects.
@@ -47,11 +48,16 @@ noFlags = { global : false
4748
, sticky : false
4849
, unicode : false }
4950

50-
foreign import regex' :: String -> String -> Regex
51+
foreign import regex' :: (String -> Either String Regex)
52+
-> (Regex -> Either String Regex)
53+
-> String
54+
-> String
55+
-> Either String Regex
5156

52-
-- | Constructs a `Regex` from a pattern string and flags.
53-
regex :: String -> RegexFlags -> Regex
54-
regex s f = regex' s $ renderFlags f
57+
-- | Constructs a `Regex` from a pattern string and flags. Fails with
58+
-- | `Left error` if the pattern contains a syntax error.
59+
regex :: String -> RegexFlags -> Either String Regex
60+
regex s f = regex' Left Right s $ renderFlags f
5561

5662
-- | Returns the pattern string used to construct the given `Regex`.
5763
foreign import source :: Regex -> String

test/Test/Data/String/Regex.purs

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,35 @@ import Prelude
44
import Data.Maybe
55
import Control.Monad.Eff.Console (log)
66
import Data.String.Regex
7+
import Data.Either (isLeft)
8+
import Data.Either.Unsafe (fromRight)
79
import Test.Assert (assert)
810

11+
-- | Unsafe version of `regex`.
12+
regex' :: String -> RegexFlags -> Regex
13+
regex' pattern flags = fromRight (regex pattern flags)
14+
915
testStringRegex = do
1016
log "regex"
11-
assert $ test (regex "^a" noFlags) "abc"
12-
assert $ not (test (regex "^b" noFlags) "abc")
17+
assert $ test (regex' "^a" noFlags) "abc"
18+
assert $ not (test (regex' "^b" noFlags) "abc")
19+
assert $ isLeft (regex "+" noFlags)
1320

1421
log "match"
15-
assert $ match (regex "^abc$" noFlags) "abc" == Just [Just "abc"]
22+
assert $ match (regex' "^abc$" noFlags) "abc" == Just [Just "abc"]
1623

1724
log "replace"
18-
assert $ replace (regex "-" noFlags) "!" "a-b-c" == "a!b-c"
25+
assert $ replace (regex' "-" noFlags) "!" "a-b-c" == "a!b-c"
1926

2027
log "replace'"
21-
assert $ replace' (regex "-" noFlags) (\s xs -> "!") "a-b-c" == "a!b-c"
28+
assert $ replace' (regex' "-" noFlags) (\s xs -> "!") "a-b-c" == "a!b-c"
2229

2330
log "search"
24-
assert $ search (regex "b" noFlags) "abc" == Just 1
25-
assert $ search (regex "d" noFlags) "abc" == Nothing
31+
assert $ search (regex' "b" noFlags) "abc" == Just 1
32+
assert $ search (regex' "d" noFlags) "abc" == Nothing
2633

2734
log "split"
28-
assert $ split (regex "" noFlags) "" == []
29-
assert $ split (regex "" noFlags) "abc" == ["a", "b", "c"]
30-
assert $ split (regex "b" noFlags) "" == [""]
31-
assert $ split (regex "b" noFlags) "abc" == ["a", "c"]
35+
assert $ split (regex' "" noFlags) "" == []
36+
assert $ split (regex' "" noFlags) "abc" == ["a", "b", "c"]
37+
assert $ split (regex' "b" noFlags) "" == [""]
38+
assert $ split (regex' "b" noFlags) "abc" == ["a", "c"]

0 commit comments

Comments
 (0)