blob: e2bc2761fcc267da18d4956c93e9f22e136e443c (
plain)
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
|
#!r6rs
(library (bs re (0))
;; Similar to Python's `re` module. One big difference is that the
;; string object to be searched is always the first argument to a
;; function. This allows us to pipe a string through multiple
;; transformations. For example:
;;
;; (-> " string "
;; string.strip
;; (re.search "in")
;; (re.group 1))
;;
;; TODO: consider putting the string as the last argument, to fit with
;; other container types like `list`, then use ->>
;; TODO: port srfi-115 to guile
;; TODO: make `match` and `search` do different things
(export match group sub search
I IGNORECASE M MULTILINE)
(import (rnrs base (6))
(ice-9 regex))
(define I regexp/icase)
(define IGNORECASE regexp/icase)
(define M regexp/newline)
(define MULTILINE regexp/newline)
;; Compile `pattern` into a regular expression object.
(define (compile pattern . flags)
(apply make-regexp (cons pattern flags)))
;; If zero or more characters at the beginning of `string` match the
;; regular expression `pattern`, return a corresponding match object.
(define (match string pattern)
(regexp-exec pattern string))
;;
(define (group match-obj n)
(if match-obj
(match:substring match-obj n)
#f))
;; Return the string obtained by replacing the leftmost
;; non-overlapping occurrences of `pattern` in `string` by the
;; replacement `repl`. If the pattern isn’t found, string is returned
;; unchanged.
(define (sub string pattern repl)
(regexp-replace pattern string repl))
;; Scan through `string` looking for the first location where the
;; regular expression `pattern` produces a match, and return a
;; corresponding match object. Returns `#f` if no match is found.
(define (search string pattern)
(regexp-exec pattern string)))
|