Documentation ¶
Overview ¶
Package strutil implements some functions to manipulate string.
Index ¶
- Variables
- func After(s, char string) string
- func AfterLast(s, char string) string
- func Before(s, char string) string
- func BeforeLast(s, char string) string
- func BytesToString(bytes []byte) string
- func CamelCase(s string) string
- func Capitalize(s string) string
- func Concat(length int, str ...string) string
- func ContainsAll(str string, substrs []string) bool
- func ContainsAny(str string, substrs []string) bool
- func Ellipsis(str string, length int) string
- func HammingDistance(a, b string) (int, error)
- func HasPrefixAny(str string, prefixes []string) bool
- func HasSuffixAny(str string, suffixes []string) bool
- func HideString(origin string, start, end int, replaceChar string) string
- func IndexOffset(str string, substr string, idxFrom int) int
- func IsBlank(str string) bool
- func IsNotBlank(str string) bool
- func IsString(v any) bool
- func KebabCase(s string) string
- func LowerFirst(s string) string
- func Pad(source string, size int, padStr string) string
- func PadEnd(source string, size int, padStr string) string
- func PadStart(source string, size int, padStr string) string
- func RegexMatchAllGroups(pattern, str string) [][]string
- func RemoveNonPrintable(str string) string
- func RemoveWhiteSpace(str string, repalceAll bool) string
- func ReplaceWithMap(str string, replaces map[string]string) string
- func Reverse(s string) string
- func Rotate(str string, shift int) string
- func Shuffle(str string) string
- func SnakeCase(s string) string
- func SplitAndTrim(str, delimiter string, characterMask ...string) []string
- func SplitEx(s, sep string, removeEmptyString bool) []string
- func SplitWords(s string) []string
- func StringToBytes(str string) (b []byte)
- func SubInBetween(str string, start string, end string) string
- func Substring(s string, offset int, length uint) string
- func TemplateReplace(template string, data map[string]string) string
- func Trim(str string, characterMask ...string) string
- func Unwrap(str string, wrapToken string) string
- func UpperFirst(s string) string
- func UpperKebabCase(s string) string
- func UpperSnakeCase(s string) string
- func WordCount(s string) int
- func Wrap(str string, wrapWith string) string
Examples ¶
- After
- AfterLast
- Before
- BeforeLast
- BytesToString
- CamelCase
- Capitalize
- Concat
- ContainsAll
- ContainsAny
- Ellipsis
- HammingDistance
- HasPrefixAny
- HasSuffixAny
- HideString
- IndexOffset
- IsBlank
- IsNotBlank
- IsString
- KebabCase
- LowerFirst
- Pad
- PadEnd
- PadStart
- RegexMatchAllGroups
- RemoveNonPrintable
- RemoveWhiteSpace
- ReplaceWithMap
- Reverse
- Rotate
- SnakeCase
- SplitAndTrim
- SplitEx
- SplitWords
- StringToBytes
- SubInBetween
- Substring
- TemplateReplace
- Trim
- Unwrap
- UpperFirst
- UpperKebabCase
- UpperSnakeCase
- WordCount
- Wrap
Constants ¶
This section is empty.
Variables ¶
var ( // DefaultTrimChars are the characters which are stripped by Trim* functions in default. DefaultTrimChars = string([]byte{ '\t', '\v', '\n', '\r', '\f', ' ', 0x00, 0x85, 0xA0, }) )
Functions ¶
func After ¶
After returns the substring after the first occurrence of a specified string in the source string. Play: https://go.dev/play/p/RbCOQqCDA7m
Example ¶
result1 := After("foo", "") result2 := After("foo", "foo") result3 := After("foo/bar", "foo") result4 := After("foo/bar", "/") result5 := After("foo/bar/baz", "/") fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) fmt.Println(result5)
Output: foo /bar bar bar/baz
func AfterLast ¶
AfterLast returns the substring after the last occurrence of a specified string in the source string. Play: https://go.dev/play/p/1TegARrb8Yn
Example ¶
result1 := AfterLast("foo", "") result2 := AfterLast("foo", "foo") result3 := AfterLast("foo/bar", "/") result4 := AfterLast("foo/bar/baz", "/") result5 := AfterLast("foo/bar/foo/baz", "foo") fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) fmt.Println(result5)
Output: foo bar baz /baz
func Before ¶
Before returns the substring of the source string up to the first occurrence of the specified string. Play: https://go.dev/play/p/JAWTZDS4F5w
Example ¶
result1 := Before("foo", "") result2 := Before("foo", "foo") result3 := Before("foo/bar", "/") result4 := Before("foo/bar/baz", "/") fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4)
Output: foo foo foo
func BeforeLast ¶
BeforeLast returns the substring of the source string up to the last occurrence of the specified string. Play: https://go.dev/play/p/pJfXXAoG_Te
Example ¶
result1 := BeforeLast("foo", "") result2 := BeforeLast("foo", "foo") result3 := BeforeLast("foo/bar", "/") result4 := BeforeLast("foo/bar/baz", "/") fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4)
Output: foo foo foo/bar
func BytesToString ¶ added in v2.1.20
BytesToString converts a byte slice to string without a memory allocation. Play: https://go.dev/play/p/6c68HRvJecH
Example ¶
bytes := []byte{'a', 'b', 'c'} result := BytesToString(bytes) fmt.Println(result)
Output: abc
func CamelCase ¶
CamelCase coverts string to camelCase string. Non letters and numbers will be ignored. Play: https://go.dev/play/p/9eXP3tn2tUy
Example ¶
strings := []string{"", "foobar", "&FOO:BAR$BAZ", "$foo%", "Foo-#1😄$_%^&*(1bar"} for _, v := range strings { s := CamelCase(v) fmt.Println(s) }
Output: foobar fooBarBaz foo foo11Bar
func Capitalize ¶
Capitalize converts the first character of a string to upper case and the remaining to lower case. Play: https://go.dev/play/p/2OAjgbmAqHZ
Example ¶
strings := []string{"", "Foo", "_foo", "fooBar", "foo-bar"} for _, v := range strings { s := Capitalize(v) fmt.Println(s) }
Output: Foo _foo Foobar Foo-bar
func Concat ¶ added in v2.3.1
Concat uses the strings.Builder to concatenate the input strings.
- `length` is the expected length of the concatenated string.
- if you are unsure about the length of the string to be concatenated, please pass 0 or a negative number.
Play: todo
Example ¶
result1 := Concat(12, "Hello", " ", "World", "!") result2 := Concat(11, "Go", " ", "Language") result3 := Concat(0, "An apple a ", "day,", "keeps the", " doctor away") fmt.Println(result1) fmt.Println(result2) fmt.Println(result3)
Output: Hello World! Go Language An apple a day,keeps the doctor away
func ContainsAll ¶ added in v2.2.1
ContainsAll return true if target string contains all the substrs. Play: https://go.dev/play/p/KECtK2Os4zq
Example ¶
str := "hello world" result1 := ContainsAll(str, []string{"hello", "world"}) result2 := ContainsAll(str, []string{"hello", "abc"}) fmt.Println(result1) fmt.Println(result2)
Output: true false
func ContainsAny ¶ added in v2.2.1
ContainsAny return true if target string contains any one of the substrs. Play: https://go.dev/play/p/dZGSSMB3LXE
Example ¶
str := "hello world" result1 := ContainsAny(str, []string{"hello", "world"}) result2 := ContainsAny(str, []string{"hello", "abc"}) result3 := ContainsAny(str, []string{"123", "abc"}) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3)
Output: true true false
func Ellipsis ¶ added in v2.3.3
Ellipsis truncates a string to a specified length and appends an ellipsis. Play: todo
Example ¶
result1 := Ellipsis("hello world", 5) result2 := Ellipsis("你好,世界!", 2) result3 := Ellipsis("😀😃😄😁😆", 3) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3)
Output: hello... 你好... 😀😃😄...
func HammingDistance ¶ added in v2.3.0
HammingDistance calculates the Hamming distance between two strings. The Hamming distance is the number of positions at which the corresponding symbols are different. This func returns an error if the input strings are of unequal lengths. Play: https://go.dev/play/p/glNdQEA9HUi
Example ¶
result, _ := HammingDistance("abc", "def") fmt.Println(result) result, _ = HammingDistance("name", "namf") fmt.Println(result)
Output: 3 1
func HasPrefixAny ¶ added in v2.1.20
HasPrefixAny check if a string starts with any of a slice of specified strings. Play: https://go.dev/play/p/8UUTl2C5slo
Example ¶
result1 := HasPrefixAny("foo bar", []string{"fo", "xyz", "hello"}) result2 := HasPrefixAny("foo bar", []string{"oom", "world"}) fmt.Println(result1) fmt.Println(result2)
Output: true false
func HasSuffixAny ¶ added in v2.1.20
HasSuffixAny check if a string ends with any of a slice of specified strings. Play: https://go.dev/play/p/sKWpCQdOVkx
Example ¶
result1 := HasSuffixAny("foo bar", []string{"bar", "xyz", "hello"}) result2 := HasSuffixAny("foo bar", []string{"oom", "world"}) fmt.Println(result1) fmt.Println(result2)
Output: true false
func HideString ¶ added in v2.2.1
HideString hide some chars in source string with param `replaceChar`. replace range is origin[start : end]. [start, end) Play: https://go.dev/play/p/pzbaIVCTreZ)
Example ¶
str := "13242658976" result1 := HideString(str, 3, 3, "*") result2 := HideString(str, 3, 4, "*") result3 := HideString(str, 3, 7, "*") result4 := HideString(str, 7, 11, "*") fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4)
Output: 13242658976 132*2658976 132****8976 1324265****
func IndexOffset ¶ added in v2.1.20
IndexOffset returns the index of the first instance of substr in string after offsetting the string by `idxFrom`, or -1 if substr is not present in string. Play: https://go.dev/play/p/qZo4lV2fomB
Example ¶
str := "foo bar hello world" result1 := IndexOffset(str, "o", 5) result2 := IndexOffset(str, "o", 0) result3 := IndexOffset(str, "d", len(str)-1) result4 := IndexOffset(str, "d", len(str)) result5 := IndexOffset(str, "f", -1) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) fmt.Println(result5)
Output: 12 1 18 -1 -1
func IsBlank ¶ added in v2.1.20
IsBlank checks if a string is whitespace, empty. Play: https://go.dev/play/p/6zXRH_c0Qd3
Example ¶
result1 := IsBlank("") result2 := IsBlank("\t\v\f\n") result3 := IsBlank(" 中文") fmt.Println(result1) fmt.Println(result2) fmt.Println(result3)
Output: true true false
func IsNotBlank ¶ added in v2.2.7
IsNotBlank checks if a string is not whitespace, not empty. Play: https://go.dev/play/p/e_oJW0RAquA
Example ¶
result1 := IsNotBlank("") result2 := IsNotBlank(" ") result3 := IsNotBlank("\t\v\f\n") result4 := IsNotBlank(" 中文") result5 := IsNotBlank(" world ") fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) fmt.Println(result5)
Output: false false false true true
func IsString ¶
IsString check if the value data type is string or not. Play: https://go.dev/play/p/IOgq7oF9ERm
Example ¶
result1 := IsString("") result2 := IsString("a") result3 := IsString(1) result4 := IsString(true) result5 := IsString([]string{"a"}) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) fmt.Println(result5)
Output: true true false false false
func KebabCase ¶
KebabCase coverts string to kebab-case, non letters and numbers will be ignored. Play: https://go.dev/play/p/dcZM9Oahw-Y
Example ¶
strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"} for _, v := range strings { s := KebabCase(v) fmt.Println(s) }
Output: foo-bar foo-bar foobar foo-1-1-bar
func LowerFirst ¶
LowerFirst converts the first character of string to lower case. Play: https://go.dev/play/p/CbzAyZmtJwL
Example ¶
strings := []string{"", "bar", "BAr", "Bar大"} for _, v := range strings { s := LowerFirst(v) fmt.Println(s) }
Output: bar bAr bar大
func Pad ¶ added in v2.1.16
Pad pads string on the left and right side if it's shorter than size. Padding characters are truncated if they exceed size. Play: https://go.dev/play/p/NzImQq-VF8q
Example ¶
result1 := Pad("foo", 1, "bar") result2 := Pad("foo", 2, "bar") result3 := Pad("foo", 3, "bar") result4 := Pad("foo", 4, "bar") result5 := Pad("foo", 5, "bar") result6 := Pad("foo", 6, "bar") result7 := Pad("foo", 7, "bar") fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) fmt.Println(result5) fmt.Println(result6) fmt.Println(result7)
Output: foo foo foo foob bfoob bfooba bafooba
func PadEnd ¶
PadEnd pads string on the right side if it's shorter than size. Padding characters are truncated if they exceed size. Play: https://go.dev/play/p/9xP8rN0vz--
Example ¶
result1 := PadEnd("foo", 1, "bar") result2 := PadEnd("foo", 2, "bar") result3 := PadEnd("foo", 3, "bar") result4 := PadEnd("foo", 4, "bar") result5 := PadEnd("foo", 5, "bar") result6 := PadEnd("foo", 6, "bar") result7 := PadEnd("foo", 7, "bar") fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) fmt.Println(result5) fmt.Println(result6) fmt.Println(result7)
Output: foo foo foo foob fooba foobar foobarb
func PadStart ¶
PadStart pads string on the left side if it's shorter than size. Padding characters are truncated if they exceed size. Play: https://go.dev/play/p/xpTfzArDfvT
Example ¶
result1 := PadStart("foo", 1, "bar") result2 := PadStart("foo", 2, "bar") result3 := PadStart("foo", 3, "bar") result4 := PadStart("foo", 4, "bar") result5 := PadStart("foo", 5, "bar") result6 := PadStart("foo", 6, "bar") result7 := PadStart("foo", 7, "bar") fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) fmt.Println(result5) fmt.Println(result6) fmt.Println(result7)
Output: foo foo foo bfoo bafoo barfoo barbfoo
func RegexMatchAllGroups ¶ added in v2.3.3
RegexMatchAllGroups Matches all subgroups in a string using a regular expression and returns the result. Play: todo
Example ¶
pattern := `(\w+\.+\w+)@(\w+)\.(\w+)` str := "Emails: john.doe@example.com and jane.doe@example.com" result := RegexMatchAllGroups(pattern, str) fmt.Println(result[0]) fmt.Println(result[1])
Output: [john.doe@example.com john.doe example com] [jane.doe@example.com jane.doe example com]
func RemoveNonPrintable ¶ added in v2.1.18
RemoveNonPrintable remove non-printable characters from a string. Play: https://go.dev/play/p/og47F5x_jTZ
Example ¶
result1 := RemoveNonPrintable("hello\u00a0 \u200bworld\n") result2 := RemoveNonPrintable("你好😄") fmt.Println(result1) fmt.Println(result2)
Output: hello world 你好😄
func RemoveWhiteSpace ¶ added in v2.2.2
RemoveWhiteSpace remove whitespace characters from a string. when set repalceAll is true removes all whitespace, false only replaces consecutive whitespace characters with one space. Play: https://go.dev/play/p/HzLC9vsTwkf
Example ¶
str := " hello \r\n \t world" result1 := RemoveWhiteSpace(str, true) result2 := RemoveWhiteSpace(str, false) fmt.Println(result1) fmt.Println(result2)
Output: helloworld hello world
func ReplaceWithMap ¶ added in v2.2.0
ReplaceWithMap returns a copy of `str`, which is replaced by a map in unordered way, case-sensitively. Play: https://go.dev/play/p/h3t7CNj2Vvu
Example ¶
str := "ac ab ab ac" replaces := map[string]string{ "a": "1", "b": "2", } result := ReplaceWithMap(str, replaces) fmt.Println(result)
Output: 1c 12 12 1c
func Reverse ¶ added in v2.1.5
Reverse returns string whose char order is reversed to the given string. Play: https://go.dev/play/p/adfwalJiecD
Example ¶
s := "foo" rs := Reverse(s) fmt.Println(s) fmt.Println(rs)
Output: foo oof
func Rotate ¶ added in v2.3.3
Rotate rotates the string by the specified number of characters. Play: todo
Example ¶
result1 := Rotate("Hello", 0) result2 := Rotate("Hello", 1) result3 := Rotate("Hello", 2) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3)
Output: Hello oHell loHel
func SnakeCase ¶
SnakeCase coverts string to snake_case, non letters and numbers will be ignored Play: https://go.dev/play/p/tgzQG11qBuN
Example ¶
strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"} for _, v := range strings { s := SnakeCase(v) fmt.Println(s) }
Output: foo_bar foo_bar foobar foo_1_1_bar
func SplitAndTrim ¶ added in v2.2.0
SplitAndTrim splits string `str` by a string `delimiter` to a slice, and calls Trim to every element of this slice. It ignores the elements which are empty after Trim. Play: https://go.dev/play/p/ZNL6o4SkYQ7
Example ¶
str := " a,b, c,d,$1 " result1 := SplitAndTrim(str, ",") result2 := SplitAndTrim(str, ",", "$") fmt.Println(result1) fmt.Println(result2)
Output: [a b c d $1] [a b c d 1]
func SplitEx ¶ added in v2.0.6
SplitEx split a given string which can control the result slice contains empty string or not. Play: https://go.dev/play/p/Us-ySSbWh-3
Example ¶
result1 := SplitEx(" a b c ", "", true) result2 := SplitEx(" a b c ", " ", false) result3 := SplitEx(" a b c ", " ", true) result4 := SplitEx("a = b = c = ", " = ", false) result5 := SplitEx("a = b = c = ", " = ", true) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) fmt.Println(result5)
Output: [] [ a b c ] [a b c] [a b c ] [a b c]
func SplitWords ¶ added in v2.1.16
SplitWords splits a string into words, word only contains alphabetic characters. Play: https://go.dev/play/p/KLiX4WiysMM
Example ¶
result1 := SplitWords("a word") result2 := SplitWords("I'am a programmer") result3 := SplitWords("a -b-c' 'd'e") result4 := SplitWords("你好,我是一名码农") result5 := SplitWords("こんにちは,私はプログラマーです") fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) fmt.Println(result5)
Output: [a word] [I'am a programmer] [a b-c' d'e] [] []
func StringToBytes ¶ added in v2.1.20
StringToBytes converts a string to byte slice without a memory allocation. Play: https://go.dev/play/p/7OyFBrf9AxA
Example ¶
result1 := StringToBytes("abc") result2 := reflect.DeepEqual(result1, []byte{'a', 'b', 'c'}) fmt.Println(result1) fmt.Println(result2)
Output: [97 98 99] true
func SubInBetween ¶ added in v2.3.0
SubInBetween return substring between the start and end position(excluded) of source string. Play: https://go.dev/play/p/EDbaRvjeNsv
Example ¶
str := "abcde" result1 := SubInBetween(str, "", "de") result2 := SubInBetween(str, "a", "d") fmt.Println(result1) fmt.Println(result2)
Output: abc bc
func Substring ¶ added in v2.1.13
Substring returns a substring of the specified length starting at the specified offset position. Play: https://go.dev/play/p/q3sM6ehnPDp
Example ¶
result1 := Substring("abcde", 1, 3) result2 := Substring("abcde", 1, 5) result3 := Substring("abcde", -1, 3) result4 := Substring("abcde", -2, 2) result5 := Substring("abcde", -2, 3) result6 := Substring("你好,欢迎你", 0, 2) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) fmt.Println(result5) fmt.Println(result6)
Output: bcd bcde e de de 你好
func TemplateReplace ¶ added in v2.3.3
TemplateReplace replaces the placeholders in the template string with the corresponding values in the data map. The placeholders are enclosed in curly braces, e.g. {key}. for example, the template string is "Hello, {name}!", and the data map is {"name": "world"}, the result will be "Hello, world!". Play: todo
Example ¶
template := `Hello, my name is {name}, I'm {age} years old.` data := map[string]string{ "name": "Bob", "age": "20", } result := TemplateReplace(template, data) fmt.Println(result)
Output: Hello, my name is Bob, I'm 20 years old.
func Trim ¶ added in v2.2.0
Trim strips whitespace (or other characters) from the beginning and end of a string. The optional parameter `characterMask` specifies the additional stripped characters. Play: https://go.dev/play/p/Y0ilP0NRV3j
Example ¶
result1 := Trim("\nabcd") str := "$ ab cd $ " result2 := Trim(str) result3 := Trim(str, "$") fmt.Println(result1) fmt.Println(result2) fmt.Println(result3)
Output: abcd $ ab cd $ ab cd
func Unwrap ¶
Unwrap a given string from anther string. will change source string. Play: https://go.dev/play/p/Ec2q4BzCpG-
Example ¶
result1 := Unwrap("foo", "") result2 := Unwrap("*foo*", "*") result3 := Unwrap("*foo", "*") result4 := Unwrap("foo*", "*") result5 := Unwrap("**foo**", "*") fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) fmt.Println(result5)
Output: foo foo *foo foo* *foo*
func UpperFirst ¶
UpperFirst converts the first character of string to upper case. Play: https://go.dev/play/p/sBbBxRbs8MM
Example ¶
strings := []string{"", "bar", "BAr", "bar大"} for _, v := range strings { s := UpperFirst(v) fmt.Println(s) }
Output: Bar BAr Bar大
func UpperKebabCase ¶ added in v2.1.12
UpperKebabCase coverts string to upper KEBAB-CASE, non letters and numbers will be ignored Play: https://go.dev/play/p/zDyKNneyQXk
Example ¶
strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"} for _, v := range strings { s := UpperKebabCase(v) fmt.Println(s) }
Output: FOO-BAR FOO-BAR FOO-BAR FOO-1-1-BAR
func UpperSnakeCase ¶ added in v2.1.12
UpperSnakeCase coverts string to upper SNAKE_CASE, non letters and numbers will be ignored Play: https://go.dev/play/p/4COPHpnLx38
Example ¶
strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"} for _, v := range strings { s := UpperSnakeCase(v) fmt.Println(s) }
Output: FOO_BAR FOO_BAR FOO_BAR FOO_1_1_BAR
func WordCount ¶ added in v2.1.16
WordCount return the number of meaningful word, word only contains alphabetic characters. Play: https://go.dev/play/p/bj7_odx3vRf
Example ¶
result1 := WordCount("a word") result2 := WordCount("I'am a programmer") result3 := WordCount("a -b-c' 'd'e") result4 := WordCount("你好,我是一名码农") result5 := WordCount("こんにちは,私はプログラマーです") fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) fmt.Println(result5)
Output: 2 3 3 0 0
func Wrap ¶
Wrap a string with given string. Play: https://go.dev/play/p/KoZOlZDDt9y
Example ¶
result1 := Wrap("foo", "") result2 := Wrap("foo", "*") result3 := Wrap("'foo'", "'") result4 := Wrap("", "*") fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4)
Output: foo *foo* ''foo''
Types ¶
This section is empty.