String
A built-in representation for efficient string manipulation. String literals
are enclosed in "double quotes"
. Strings are not lists of characters.
Strings
A String
is a chunk of text:
"Hello!"
"How are you?"
"🙈🙉🙊"
-- strings with escape characters
"this\n\t\"that\""
"🙈🙉🙊" -- "🙈🙉🙊"
-- multiline strings
"""Triple double quotes let you
create "multiline strings" which
can have unescaped quotes and newlines.
"""
A String
can represent any sequence of unicode characters. You can use
the unicode escapes from \u{0000}
to \u{10FFFF}
to represent characters
by their code point. You can also include the unicode characters directly.
Using the escapes can be better if you need one of the many whitespace
characters with different widths.
Note: JavaScript lets you use double quotes and single quotes interchangably.
This is not true in Gren. You must use double quotes for a String
, and you must
use single quotes for a Char
.
Determine if a string is empty.
isEmpty "" == True
isEmpty "the world" == False
Get the length of a string.
length "innumerable" == 11
length "" == 0
Reverse a string.
reverse "stressed" == "desserts"
Repeat a string n times.
repeat 3 "ha" == "hahaha"
Replace all occurrences of some substring.
replace "." "-" "Json.Decode.succeed" == "Json-Decode-succeed"
replace "," "/" "a,b,c,d,e" == "a/b/c/d/e"
Note: If you need more advanced replacements, check out the
gren/parser
or gren/regex
package.
Building and Splitting
Append two strings. You can also use the (++)
operator
to do this.
append "butter" "fly" == "butterfly"
Concatenate many strings into one.
concat [ "never", "the", "less" ] == "nevertheless"
Split a string using a given separator.
split "," "cat,dog,cow" == [ "cat", "dog", "cow" ]
split "/" "home/evan/Desktop/" == [ "home", "evan", "Desktop", "" ]
Put many strings together with a given separator.
join "a" [ "H", "w", "ii", "n" ] == "Hawaiian"
join " " [ "cat", "dog", "cow" ] == "cat dog cow"
join "/" [ "home", "evan", "Desktop" ] == "home/evan/Desktop"
Break a string into words, splitting on chunks of whitespace.
words "How are \t you? \n Good?" == [ "How", "are", "you?", "Good?" ]
Break a string into lines, splitting on newlines.
lines "How are you?\nGood?" == [ "How are you?", "Good?" ]
Get Substrings
Take a substring given a start and end index. Negative indexes are taken starting from the end of the list.
slice 7 9 "snakes on a plane!" == "on"
slice 0 6 "snakes on a plane!" == "snakes"
slice 0 -7 "snakes on a plane!" == "snakes on a"
slice -6 -1 "snakes on a plane!" == "plane"
Take n characters from the left side of a string.
left 2 "Mulder" == "Mu"
Take n characters from the right side of a string.
right 2 "Scully" == "ly"
Drop n characters from the left side of a string.
dropLeft 2 "The Lone Gunmen" == "e Lone Gunmen"
Drop n characters from the right side of a string.
dropRight 2 "Cigarette Smoking Man" == "Cigarette Smoking M"
Check for Substrings
See if the second string contains the first one.
contains "the" "theory" == True
contains "hat" "theory" == False
contains "THE" "theory" == False
See if the second string starts with the first one.
startsWith "the" "theory" == True
startsWith "ory" "theory" == False
See if the second string ends with the first one.
endsWith "the" "theory" == False
endsWith "ory" "theory" == True
Get all of the indices for a substring in another string.
indexes "i" "Mississippi" == [ 1, 4, 7, 10 ]
indexes "ss" "Mississippi" == [ 2, 5 ]
indexes "needle" "haystack" == []
Int Conversions
Try to convert a string into an int, failing on improperly formatted strings.
String.toInt "123" == Just 123
String.toInt "-42" == Just -42
String.toInt "3.1" == Nothing
String.toInt "31a" == Nothing
If you are extracting a number from some raw user input, you will typically
want to use Maybe.withDefault
to handle bad data:
Maybe.withDefault 0 (String.toInt "42") == 42
Maybe.withDefault 0 (String.toInt "ab") == 0
Convert an Int
to a String
.
String.fromInt 123 == "123"
String.fromInt -42 == "-42"
Check out Debug.toString
to convert any value to a string
for debugging purposes.
Float Conversions
Try to convert a string into a float, failing on improperly formatted strings.
String.toFloat "123" == Just 123.0
String.toFloat "-42" == Just -42.0
String.toFloat "3.1" == Just 3.1
String.toFloat "31a" == Nothing
If you are extracting a number from some raw user input, you will typically
want to use Maybe.withDefault
to handle bad data:
Maybe.withDefault 0 (String.toFloat "42.5") == 42.5
Maybe.withDefault 0 (String.toFloat "cats") == 0
Convert a Float
to a String
.
String.fromFloat 123 == "123"
String.fromFloat -42 == "-42"
String.fromFloat 3.9 == "3.9"
Check out Debug.toString
to convert any value to a string
for debugging purposes.
Char Conversions
Create a string from a given character.
fromChar 'a' == "a"
Add a character to the beginning of a string.
cons 'T' "he truth is out there" == "The truth is out there"
Split a non-empty string into its head and tail. This lets you pattern match on strings exactly as you would with lists.
uncons "abc" == Just ( 'a', "bc" )
uncons "" == Nothing
Array Conversions
Convert a string to a list of characters.
toArray "abc" == [ 'a', 'b', 'c' ]
toArray "🙈🙉🙊" == [ '🙈', '🙉', '🙊' ]
Convert a list of characters into a String. Can be useful if you want to create a string primarily by consing, perhaps for decoding something.
fromArray [ 'a', 'b', 'c' ] == "abc"
fromArray [ '🙈', '🙉', '🙊' ] == "🙈🙉🙊"
Formatting
Cosmetic operations such as padding with extra characters or trimming whitespace.
Convert a string to all upper case. Useful for case-insensitive comparisons and VIRTUAL YELLING.
toUpper "skinner" == "SKINNER"
Convert a string to all lower case. Useful for case-insensitive comparisons.
toLower "X-FILES" == "x-files"
Pad a string on both sides until it has a given length.
pad 5 ' ' "1" == " 1 "
pad 5 ' ' "11" == " 11 "
pad 5 ' ' "121" == " 121 "
Pad a string on the left until it has a given length.
padLeft 5 '.' "1" == "....1"
padLeft 5 '.' "11" == "...11"
padLeft 5 '.' "121" == "..121"
Pad a string on the right until it has a given length.
padRight 5 '.' "1" == "1...."
padRight 5 '.' "11" == "11..."
padRight 5 '.' "121" == "121.."
Get rid of whitespace on both sides of a string.
trim " hats \n" == "hats"
Get rid of whitespace on the left of a string.
trimLeft " hats \n" == "hats \n"
Get rid of whitespace on the right of a string.
trimRight " hats \n" == " hats"
Higher-Order Functions
Transform every character in a string
map
(\c ->
if c == '/' then
'.'
else
c
)
"a/b/c"
== "a.b.c"
Keep only the characters that pass the test.
filter isDigit "R2-D2" == "22"
Reduce a string from the left.
foldl cons "" "time" == "emit"
Reduce a string from the right.
foldr cons "" "time" == "time"
Determine whether any characters pass the test.
any isDigit "90210" == True
any isDigit "R2-D2" == True
any isDigit "heart" == False
any isDigit "" == False
Determine whether all characters pass the test.
all isDigit "90210" == True
all isDigit "R2-D2" == False
all isDigit "heart" == False
all isDigit "" = True