From 8fadc570fcf720927ba2ee78acec9d1a143748b9 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Fri, 30 Nov 2007 19:34:17 -0600 Subject: [PATCH] Add \Q...\E (escape all characters between \Q and \E) --- extra/regexp/regexp-tests.factor | 5 +++++ extra/regexp/regexp.factor | 11 ++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/extra/regexp/regexp-tests.factor b/extra/regexp/regexp-tests.factor index c5f8699123..94f9ad172f 100644 --- a/extra/regexp/regexp-tests.factor +++ b/extra/regexp/regexp-tests.factor @@ -149,3 +149,8 @@ IN: regexp-tests [ f ] [ "abc" "[\\p{Upper}]{3}" matches? ] unit-test [ t ] [ "ABC" "[\\p{Upper}]{3}" matches? ] unit-test +[ t ] [ "" "\\Q\\E" matches? ] unit-test +[ f ] [ "a" "\\Q\\E" matches? ] unit-test +[ t ] [ "|*+" "\\Q|*+\\E" matches? ] unit-test +[ f ] [ "abc" "\\Q|*+\\E" matches? ] unit-test + diff --git a/extra/regexp/regexp.factor b/extra/regexp/regexp.factor index b5e186b58f..ba1bd6c32d 100644 --- a/extra/regexp/regexp.factor +++ b/extra/regexp/regexp.factor @@ -109,11 +109,17 @@ IN: regexp { "\\p{Space}" [ java-blank? ] } } [ first2 satisfy-token ] [ <|> ] map-reduce ; +: 'escaped-seq' ( -- parser ) + "\\Q" token + any-char-parser <*> [ token ] <@ &> + "\\E" token <& ; + : 'escape-seq' ( -- parser ) 'simple-escape-char' 'predefined-char-class' <|> 'octal' <|> 'hex' <|> + 'escaped-seq' <|> 'control-character' <|> 'posix-character-class' <|> ; @@ -239,8 +245,3 @@ M: object >regexp ; : R" CHAR: " parse-regexp ; parsing : R' CHAR: ' parse-regexp ; parsing : R` CHAR: ` parse-regexp ; parsing - -! \Q \E -! Must escape to use as literals -! : meta-chars "[\\^$.|?*+()" ; -