diff options
author | Rado <r.hampartsumyan@viscomp.bg> | 2024-06-18 21:27:46 +0300 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2024-06-23 13:37:27 +0100 |
commit | 53b475e86fc3bd5d31773de3bf395b6c91b79a6c (patch) | |
tree | 26fa73e0db558ee94a2ef9dc374cd9b134664090 | |
parent | e5c3a0d8cf2d631c4e74dc02b14f5d82b3ed15af (diff) | |
download | gleam_stdlib-53b475e86fc3bd5d31773de3bf395b6c91b79a6c.tar.gz gleam_stdlib-53b475e86fc3bd5d31773de3bf395b6c91b79a6c.zip |
Implement regex.replace
-rw-r--r-- | src/gleam/regex.gleam | 27 | ||||
-rw-r--r-- | src/gleam_stdlib.erl | 5 | ||||
-rw-r--r-- | src/gleam_stdlib.mjs | 4 | ||||
-rw-r--r-- | test/gleam/regex_test.gleam | 14 |
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!") +} |