From f18c207d115a5d2bf350c6ec555bd74e35f0c303 Mon Sep 17 00:00:00 2001 From: Ben Greenman Date: Sun, 12 Jun 2016 15:17:15 -0400 Subject: [PATCH] [private] rx: allow \ between [...] --- test/regexp-pass.rkt | 7 +++++++ trivial/private/regexp.rkt | 8 ++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/test/regexp-pass.rkt b/test/regexp-pass.rkt index d2c7a97..1e42ac8 100644 --- a/test/regexp-pass.rkt +++ b/test/regexp-pass.rkt @@ -13,6 +13,13 @@ ;; -- regexps, from the world + (let ([str "dont care"]) ;; from `tests/racket/contract/multi-file.rkt` + (check-equal? + (ann + (regexp-match: #rx"[/\\]([-a-z0-9.]*)[^/\\]*$" str) + (U #f (List String String))) + #f)) + (let ([l "dont care"]) ;; from `morse-code-table.rkt` (check-equal? (ann diff --git a/trivial/private/regexp.rkt b/trivial/private/regexp.rkt index e287729..e68a28f 100644 --- a/trivial/private/regexp.rkt +++ b/trivial/private/regexp.rkt @@ -149,6 +149,7 @@ (define (unescaped-pos* str c*) (define L (string-length str)) (define escaped? (box #f)) + (define most-recent-char (box #f)) (define (have-char-at-index? c i hist) (memv i (hash-ref hist c))) (define h-rev @@ -157,7 +158,8 @@ (define char (unsafe-string-ref str i)) (cond [(unbox escaped?) - (unless (eq? #\\ char) + (when (or (not (eq? #\\ char)) + (eq? #\[ (unbox most-recent-char))) (set-box! escaped? #f)) hist] [(eq? #\\ char) @@ -173,7 +175,9 @@ [else (let ([i* (hash-ref hist char #f)]) (if i* - (hash-set hist char (cons i i*)) + (begin + (set-box! most-recent-char char) + (hash-set hist char (cons i i*))) hist))]))) ;; -- reverse all saved lists (for/hasheq ([(c i*) (in-hash h-rev)])