From 8e4ce647d367fdb2d02c3da9c79eeff214d94a76 Mon Sep 17 00:00:00 2001 From: John Benediktsson Date: Sun, 18 May 2014 13:48:22 -0700 Subject: [PATCH] regexp: adding re-replace-with. --- basis/regexp/regexp-docs.factor | 22 ++++++++++++++++++++-- basis/regexp/regexp.factor | 10 +++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/basis/regexp/regexp-docs.factor b/basis/regexp/regexp-docs.factor index 064a2dd00f..4c6ea1344d 100644 --- a/basis/regexp/regexp-docs.factor +++ b/basis/regexp/regexp-docs.factor @@ -182,7 +182,7 @@ ARTICLE: "regexp-operations" "Matching operations with regular expressions" "Splitting a string into tokens delimited by a regular expression:" { $subsections re-split } "Replacing occurrences of a regular expression with a string:" -{ $subsections re-replace } ; +{ $subsections re-replace re-replace-with } ; ARTICLE: "regexp-deploy" "Regular expressions and the deploy tool" "The " { $link "tools.deploy" } " tool has the option to strip out the optimizing compiler from the resulting image. Since regular expressions compile to Factor code, this creates a minor performance-related caveat." @@ -227,7 +227,25 @@ HELP: re-split HELP: re-replace { $values { "string" string } { "regexp" regexp } { "replacement" string } { "result" string } } -{ $description "Replaces substrings which match the input regexp with the given replacement text. The boundaries of the substring are chosen by the strategy used by " { $link all-matching-slices } "." } ; +{ $description "Replaces substrings which match the input regexp with the given replacement text. The boundaries of the substring are chosen by the strategy used by " { $link all-matching-slices } "." } +{ $examples + { $example + "USING: prettyprint regexp ;" + "\"python is pythonic\" R/ python/ \"factor\" re-replace ." + "\"factor is factoric\"" } +} ; + +HELP: re-replace-with +{ $values { "string" string } { "regexp" regexp } { "quot" { $quotation "( slice -- replacement )" } } { "result" string } } +{ $description "Replaces substrings which match the input regexp with the result of calling " { $snippet "quot" } " on each matching slice. The boundaries of the substring are chosen by the strategy used by " { $link all-matching-slices } "." } +{ $examples + { $example + "USING: ascii prettyprint regexp ;" + "\"abcdefghi\" R/ [aeiou]/ [ >upper ] re-replace-with ." + "\"AbcdEfghI\"" } +} ; + +{ re-replace re-replace-with } related-words HELP: first-match { $values { "string" string } { "regexp" regexp } { "slice/f" "the match, if one exists" } } diff --git a/basis/regexp/regexp.factor b/basis/regexp/regexp.factor index 6070921d8d..c0d6333390 100644 --- a/basis/regexp/regexp.factor +++ b/basis/regexp/regexp.factor @@ -113,7 +113,7 @@ PRIVATE> : re-replace ( string regexp replacement -- result ) [ [ subseq ] (re-split) ] dip join ; +:: re-replace-with ( string regexp quot: ( slice -- replacement ) -- result ) + [ + 0 string regexp [ + drop [ [ string , ] keep ] dip + [ string quot call( x -- x ) , ] keep + ] each-match string [ length ] [ ] bi , + ] { } make concat ; +