From 96245a828aa9c717b847812812546667e090ee3f Mon Sep 17 00:00:00 2001 From: Ben Sima Date: Tue, 19 May 2020 17:25:49 -0700 Subject: Add more re functions and docs --- bs/re.scm | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 7 deletions(-) (limited to 'bs') diff --git a/bs/re.scm b/bs/re.scm index 6ecc074..e2bc276 100644 --- a/bs/re.scm +++ b/bs/re.scm @@ -1,11 +1,55 @@ #!r6rs (library (bs re (0)) - (export match group) + + ;; 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 (match s pat) - (string-match pat s)) - (define (group m n) - (if m - (match:substring m n) - #f))) + + (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))) -- cgit v1.2.3