]> gitweb.factorcode.org Git - factor.git/commitdiff
regexp: adding re-replace-with.
authorJohn Benediktsson <mrjbq7@gmail.com>
Sun, 18 May 2014 20:48:22 +0000 (13:48 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Sun, 18 May 2014 20:48:22 +0000 (13:48 -0700)
basis/regexp/regexp-docs.factor
basis/regexp/regexp.factor

index 064a2dd00f00c83a162440c9afbc03980bd72c9a..4c6ea1344d0a7eb476e27f996baf27539f4feb0b 100644 (file)
@@ -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" } }
index 6070921d8d4026608322594606509306e6e3d28c..c0d633339066d253431379a430850259a4928fe5 100644 (file)
@@ -113,7 +113,7 @@ PRIVATE>
 
 <PRIVATE
 
-:: (re-split) ( string regexp quot -- new-slices )
+:: (re-split) ( string regexp quot: ( from to seq -- slice ) -- new-slices )
     0 string regexp [| end start end' string |
         end' ! leave it on the stack for the next iteration
         end start string quot call
@@ -138,6 +138,14 @@ 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 <slice-unsafe> , ] keep ] dip
+            [ string <slice-unsafe> quot call( x -- x ) , ] keep
+        ] each-match string [ length ] [ <slice-unsafe> ] bi ,
+    ] { } make concat ;
+
 <PRIVATE
 
 : get-ast ( regexp -- ast )