regexp: adding re-replace-with.

db4
John Benediktsson 2014-05-18 13:48:22 -07:00
parent 307b700acc
commit 8e4ce647d3
2 changed files with 29 additions and 3 deletions

View 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" } }

View 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 )