📜  Elixir-字符串

📅  最后修改于: 2020-11-04 08:23:27             🧑  作者: Mango


 

Elixir中的字符串插入在双引号之间,并以UTF-8编码。与C和C++的默认字符串为ASCII编码,并且只能输入256个不同的字符不同,UTF-8由1,112,064个代码点组成。这意味着UTF-8编码由许多不同的可能字符。由于字符串使用utf-8,因此我们也可以使用ö,ł等符号。

创建一个字符串

要创建字符串变量,只需将字符串分配给变量-

str = "Hello world"

要将其打印到控制台,只需调用IO.puts函数并将其传递给变量str-

str = str = "Hello world" 
IO.puts(str)

上面的程序产生以下结果-

Hello World

空字符串

您可以使用字符串字面量“”创建一个空字符串。例如,

a = ""
if String.length(a) === 0 do
   IO.puts("a is an empty string")
end

上面的程序产生以下结果。

a is an empty string

字符串插值

字符串插值是通过将常量,变量,字面量和表达式的值包含在字符串字面量来构造新的String值的方法。 Elixir支持字符串插值,以便在字符串使用变量,在编写变量时,请用花括号将其括起来,并在花括号前添加一个“#”符号。

例如,

x = "Apocalypse" 
y = "X-men #{x}"
IO.puts(y)

这将采用x的值并将其替换为y。上面的代码将产生以下结果-

X-men Apocalypse

字符串串联

在前面的章节中,我们已经看到了String串联的使用。 ‘<>’运算符用于连接Elixir中的字符串。要连接2个字符串,

x = "Dark"
y = "Knight"
z = x <> " " <> y
IO.puts(z)

上面的代码生成以下结果-

Dark Knight

弦长

要获取字符串的长度,我们使用String.length函数。将字符串作为参数传递,它将显示出它的大小。例如,

IO.puts(String.length("Hello"))

当运行上述程序时,它产生以下结果-

5

反转字符串

要反转字符串,请将其传递给String.reverse函数。例如,

IO.puts(String.reverse("Elixir"))

上面的程序产生以下结果-

rixilE

字符串比较

要比较2个字符串,我们可以使用==或===运算符。例如,

var_1 = "Hello world"
var_2 = "Hello Elixir"
if var_1 === var_2 do
   IO.puts("#{var_1} and #{var_2} are the same")
else
   IO.puts("#{var_1} and #{var_2} are not the same")
end

上面的程序产生以下结果-

Hello world and Hello elixir are not the same.

字符串匹配

我们已经看到了=〜字符串匹配运算符的用法。要检查字符串与正则表达式匹配,我们还可以使用字符串匹配运算符或String.match?。函数。例如,

IO.puts(String.match?("foo", ~r/foo/))
IO.puts(String.match?("bar", ~r/foo/))

上面的程序产生以下结果-

true 
false

也可以通过使用=〜运算符来实现。例如,

IO.puts("foo" =~ ~r/foo/)

上面的程序产生以下结果-

true

字符串函数

Elixir支持大量与字符串相关的功能,下表列出了一些最常用的功能。

Sr.No. Function and its Purpose
1 at(string, position)

Returns the grapheme at the position of the given utf8 string. If position is greater than string length, then it returns nil

2 capitalize(string)

Converts the first character in the given string to uppercase and the remainder to lowercase

3 contains?(string, contents)

Checks if string contains any of the given contents

4 downcase(string)

Converts all characters in the given string to lowercase

5 ends_with?(string, suffixes)

Returns true if string ends with any of the suffixes given

6 first(string)

Returns the first grapheme from a utf8 string, nil if the string is empty

7 last(string)

Returns the last grapheme from a utf8 string, nil if the string is empty

8 replace(subject, pattern, replacement, options \\ [])

Returns a new string created by replacing occurrences of pattern in subject with replacement

9 slice(string, start, len)

Returns a substring starting at the offset start, and of length len

10 split(string)

Divides a string into substrings at each Unicode whitespace occurrence with leading and trailing whitespace ignored. Groups of whitespace are treated as a single occurrence. Divisions do not occur on non-breaking whitespace

11 upcase(string)

Converts all characters in the given string to uppercase

二进制文件

二进制只是字节序列。二进制文件是使用<< >>定义的。例如:

<< 0, 1, 2, 3 >>

当然,这些字节可以以任何方式进行组织,即使其序列不能使它们成为有效的字符串。例如,

<< 239, 191, 191 >>

字符串也是二进制文件。字符串串联运算符<>实际上是二进制串联运算符:

IO.puts(<< 0, 1 >> <> << 2, 3 >>)

上面的代码生成以下结果-

<< 0, 1, 2, 3 >>

注意ł字符。由于这是utf-8编码的,因此此字符表示占用2个字节。

由于二进制中表示的每个数字都是一个字节,因此当该值从255升高时,它将被截断。为了防止这种情况,我们使用大小修饰符来指定我们希望该数字取多少位。例如-

IO.puts(<< 256 >>) # truncated, it'll print << 0 >>
IO.puts(<< 256 :: size(16) >>) #Takes 16 bits/2 bytes, will print << 1, 0 >>

上面的程序将产生以下结果-

<< 0 >>
<< 1, 0 >>

我们也可以使用utf8修饰符,如果一个字符是代码点,它将在输出中产生;否则字节-

IO.puts(<< 256 :: utf8 >>)

上面的程序产生以下结果-

Ā

我们还有一个名为is_binary的函数,用于检查给定变量是否为二进制。请注意,只有以8位的倍数存储的变量才是二进制文件。

位串

如果我们使用size修饰符定义一个二进制文件,并将其传递的值不是8的倍数,则最终将得到一个位串而不是二进制文件。例如,

bs = << 1 :: size(1) >>
IO.puts(bs)
IO.puts(is_binary(bs))
IO.puts(is_bitstring(bs))

上面的程序产生以下结果-

<< 1::size(1) >>
false
true

这意味着变量bs不是二进制,而是位串。我们也可以说二进制是一个位串,其中位数可以被8整除。模式匹配对二进制和位串都以相同的方式起作用。