aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRado <r.hampartsumyan@viscomp.bg>2024-06-18 21:27:46 +0300
committerLouis Pilfold <louis@lpil.uk>2024-06-23 13:37:27 +0100
commit53b475e86fc3bd5d31773de3bf395b6c91b79a6c (patch)
tree26fa73e0db558ee94a2ef9dc374cd9b134664090
parente5c3a0d8cf2d631c4e74dc02b14f5d82b3ed15af (diff)
downloadgleam_stdlib-53b475e86fc3bd5d31773de3bf395b6c91b79a6c.tar.gz
gleam_stdlib-53b475e86fc3bd5d31773de3bf395b6c91b79a6c.zip
Implement regex.replace
-rw-r--r--src/gleam/regex.gleam27
-rw-r--r--src/gleam_stdlib.erl5
-rw-r--r--src/gleam_stdlib.mjs4
-rw-r--r--test/gleam/regex_test.gleam14
4 files changed, 49 insertions, 1 deletions
diff --git a/src/gleam/regex.gleam b/src/gleam/regex.gleam
index eecb3ec..ad504d0 100644
--- a/src/gleam/regex.gleam
+++ b/src/gleam/regex.gleam
@@ -190,3 +190,30 @@ pub fn scan(with regex: Regex, content string: String) -> List(Match) {
@external(erlang, "gleam_stdlib", "regex_scan")
@external(javascript, "../gleam_stdlib.mjs", "regex_scan")
fn do_scan(a: Regex, b: String) -> List(Match)
+
+/// Creates a new `String` by replacing all substrings that match the regular expression.
+///
+/// ## Examples
+///
+/// ```gleam
+/// let assert OK(re) = regex.from_string("^https://")
+/// replace("https://example.com", each: re, with: "www.")
+/// // -> "www.example.com"
+/// ```
+///
+/// ```gleam
+/// let assert OK(re) = regex.from_string("[, +-]")
+/// replace("a,b-c d+e", each: re, with: "/")
+/// // -> "a/b/c/d/e"
+/// `
+pub fn replace(
+ in string: String,
+ each pattern: Regex,
+ with substitute: String,
+) -> String {
+ do_replace(pattern, string, substitute)
+}
+
+@external(erlang, "gleam_stdlib", "regex_replace")
+@external(javascript, "../gleam_stdlib.mjs", "regex_replace")
+fn do_replace(a: Regex, b: String, c: String) -> String
diff --git a/src/gleam_stdlib.erl b/src/gleam_stdlib.erl
index 2596f41..97b8831 100644
--- a/src/gleam_stdlib.erl
+++ b/src/gleam_stdlib.erl
@@ -14,7 +14,7 @@
decode_tuple5/1, decode_tuple6/1, tuple_get/2, classify_dynamic/1, print/1,
println/1, print_error/1, println_error/1, inspect/1, float_to_string/1,
int_from_base_string/2, utf_codepoint_list_to_string/1, contains_string/2,
- crop_string/2, base16_decode/1, string_replace/3
+ crop_string/2, base16_decode/1, string_replace/3, regex_replace/3
]).
%% Taken from OTP's uri_string module
@@ -259,6 +259,9 @@ regex_scan(Regex, String) ->
nomatch -> []
end.
+regex_replace(Regex, Subject, Replacement) ->
+ re:replace(Subject, Regex, Replacement, [global, {return, binary}]).
+
base_decode64(S) ->
try {ok, base64:decode(S)}
catch error:_ -> {error, nil}
diff --git a/src/gleam_stdlib.mjs b/src/gleam_stdlib.mjs
index 83fcec9..65e7a3e 100644
--- a/src/gleam_stdlib.mjs
+++ b/src/gleam_stdlib.mjs
@@ -446,6 +446,10 @@ export function regex_scan(regex, string) {
return List.fromArray(matches);
}
+export function regex_replace(regex, original_string, replacement) {
+ return original_string.replaceAll(regex, replacement)
+}
+
export function new_map() {
return Dict.new();
}
diff --git a/test/gleam/regex_test.gleam b/test/gleam/regex_test.gleam
index 4174125..9229b93 100644
--- a/test/gleam/regex_test.gleam
+++ b/test/gleam/regex_test.gleam
@@ -161,3 +161,17 @@ pub fn scan_test() {
regex.scan(re, "const age = 32")
|> should.equal([])
}
+
+pub fn replace_test() {
+ let assert Ok(re) = regex.from_string(",")
+ regex.replace(in: "a,b,c,d", each: re, with: " ")
+ |> should.equal("a b c d")
+
+ let assert Ok(re) = regex.from_string("\\d")
+ regex.replace(in: "Hell1o, World!1", each: re, with: "")
+ |> should.equal("Hello, World!")
+
+ let assert Ok(re) = regex.from_string("🐈")
+ regex.replace(in: "🐈🐈 are great!", each: re, with: "🐕")
+ |> should.equal("🐕🐕 are great!")
+}