"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."
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" } }
<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
: 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 )