Julia - 字符串

字符串可以定义为一个或多个字符的有限序列。 它们通常用双引号引起来。 例如:"这是 Julia 编程语言"。 以下是有关字符串的要点 −

  • 字符串是不可变的,即一旦创建就无法更改它们。

  • 使用两个特定字符时需要格外小心 − 双引号(")美元符号($)。 这是因为如果我们想在字符串中包含双引号字符,那么它前面必须有一个反斜杠; 否则我们会得到不同的结果,因为字符串的其余部分将被解释为 Julia 代码。 另一方面,如果我们想包含美元符号,那么它前面还必须有一个反斜杠,因为美元符号用于字符串插值。/p>

  • 在 Julia 中,用于字符串和字符串文字的内置具体类型是 String,它通过 UTF-8 编码支持全范围的 Unicode 字符。

  • Julia 中的所有字符串类型都是抽象类型 AbstractString 的子类型。 如果您希望 Julia 接受任何字符串类型,则需要将该类型声明为 AbstractString

  • Julia 有一个用于表示单个字符的一流类型。 它被称为AbstractChar

字符

单个字符用Char值表示。 Char 是一种 32 位原始类型,可以转换为数值(表示 Unicode 代码点)。

julia> 'a'
'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)

julia> typeof(ans)
Char

我们可以将 Char 转换为其整数值,如下所示 −

julia> Int('a')
97

julia> typeof(ans)
Int64

我们还可以将整数值转换回 Char,如下所示 −

julia> Char(97)
'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)

使用 Char 值,我们可以进行一些算术和比较。 这可以借助以下示例来理解 −

julia> 'X' < 'x'
true

julia> 'X' <= 'x' <= 'Y'
false

julia> 'X' <= 'a' <= 'Y'
false

julia> 'a' <= 'x' <= 'Y'
false

julia> 'A' <= 'X' <= 'Y'
true

julia> 'x' - 'b'
22

julia> 'x' + 1
'y': ASCII/Unicode U+0079 (category Ll: Letter, lowercase)

用双引号或三个双引号分隔

正如我们所讨论的,Julia 中的字符串可以使用双引号或三双引号来声明。 例如,如果您需要向字符串中的某个部分添加引号,则可以使用双引号和三双引号来执行此操作,如下所示 −

julia> str = "This is Julia Programming Language.\n"
"This is Julia Programming Language.\n"

julia> """See the "quote" characters"""
"See the \"quote\" characters"

用end进行算术和其他运算

就像普通值一样,我们可以使用 end 执行算术以及其他操作。 检查下面给出的示例 −

julia> str[end-1]
'.': ASCII/Unicode U+002E (category Po: Punctuation, other)

julia> str[end÷2]
'g': ASCII/Unicode U+0067 (category Ll: Letter, lowercase)

使用范围索引提取子字符串

我们可以使用范围索引从字符串中提取子字符串。 检查下面给出的示例 −

julia> str[6:9]
"is J"

使用子字符串

在上述方法中,Range 索引会复制原始字符串的选定部分,但我们可以使用 SubString 创建字符串视图,如下例所示 −

julia> substr = SubString(str, 1, 4)
"This"

julia> typeof(substr)
SubString{String}

Unicode 和 UTF-8

Julia 编程语言完全支持 Unicode 字符和字符串。 在字符文字中,Unicode \u 和 \U 转义序列以及所有标准 C 转义序列可用于表示 Unicode 代码点。 它显示在给定的示例中 −

julia> s = "\u2200 x \u2203 y"
"∀ x ∃ y"

另一种编码是 UTF-8,一种可变宽度编码,用于对字符串文字进行编码。 这里,可变宽度编码意味着所有字符都不是以相同数量的字节(即代码单元)编码的。 例如,在 UTF-8 中 −

  • ASCII 字符(代码点小于 080(128))使用单个字节进行编码,就像它们在 ASCII 中一样。

  • 另一方面,代码点 080(128) 及以上使用多个字节进行编码(每个字符最多四个字节)。

我们上面提到的代码单元(UTF-8 的字节)是 Julia 中的字符串索引。 它们实际上是用于编码任意字符的固定宽度构建块。 换句话说,字符串中的每个索引不一定都是有效索引。 您可以查看下面的示例 −

julia> s[1]
'∀': Unicode U+2200 (category Sm: Symbol, math)
julia> s[2]
ERROR: StringIndexError("∀ x ∃ y", 2)
Stacktrace:
 [1] string_index_err(::String, ::Int64) at .\strings\string.jl:12
 [2] getindex_continued(::String, ::Int64, ::UInt32) at .\strings\string.jl:220
 [3] getindex(::String, ::Int64) at .\strings\string.jl:213
 [4] top-level scope at REPL[106]:1,

字符串连接

连接是最有用的字符串操作之一。 以下是串联的示例 −

julia> A = "Hello"
"Hello"
julia> B = "Julia Programming Language"
"Julia Programming Language"
julia> string(A, ", ", B, ".\n")
"Hello, Julia Programming Language.\n"

我们还可以借助 * 来连接 Julia 中的字符串。 下面给出了相同的示例 −

julia> A = "Hello"
"Hello"
julia> B = "Julia Programming Language"
"Julia Programming Language"
julia> A * ", " * B * ".\n"
"Hello, Julia Programming Language.\n"

插值

使用串联来连接字符串有点麻烦。 因此,Julia 允许对字符串进行插值,并减少对字符串的这些详细调用的需要。 该插值可以通过使用美元符号 ($) 来完成。 例如 −

julia> A = "Hello"
"Hello"
julia> B = "Julia Programming Language"
"Julia Programming Language"
julia> "$A, $B.\n"
"Hello, Julia Programming Language.\n"

Julia 采用 $ 后的表达式; 作为其整个值将被插入到字符串中的表达式。 这就是我们可以使用括号将任何表达式插入字符串的原因。 例如 −

julia> "100 + 10 = $(100 + 10)"
"100 + 10 = 110"

现在,如果您想在字符串中使用文字 $,那么您需要使用反斜杠对其进行转义,如下所示 −

julia> print("His salary is \$5000 per month.\n")
His salary is $5000 per month.

三引号字符串

我们知道我们可以使用三引号创建字符串,如下例所示 −

julia> """See the "quote" characters"""
"See the \"quote\" characters"

这种有以下优点 −

三引号字符串缩进到最不想要的行的级别,因此这对于定义缩进的代码非常有用。 以下是相同的示例 −

julia> str = """
                  This is,
                  Julia Programming Language.
               """
" This is,\n Julia Programming Language.\n"

所有行中空格或制表符的最长公共起始序列称为缩进级别,但它不包括以下内容 −

  • """后面的行

  • 仅包含空格或制表符的行

julia> """ This
             is
               Julia Programming Language"""
"       This\nis\n Julia Programming Language"

常见字符串操作

使用 Julia 提供的字符串运算符,我们可以比较两个字符串,搜索特定字符串是否包含给定的子字符串,以及连接/连接两个字符串。

标准比较运算符

通过使用以下标准比较运算符,我们可以按字典顺序比较字符串 −

julia> "abababab" < "Tutorialspoint"
false

julia> "abababab" > "Tutorialspoint"
true

julia> "abababab" == "Tutorialspoint"
false

julia> "abababab" != "Tutorialspoint"
true

julia> "100 + 10 = 110" == "100 + 10 = $(100 + 10)"
true

搜索运算符

Julia 为我们提供了 findfirstfindlast 函数来搜索字符串中特定字符的索引。 您可以查看以下这两个函数的示例 −

julia> findfirst(isequal('o'), "Tutorialspoint")
4

julia> findlast(isequal('o'), "Tutorialspoint")
11

Julia 还为我们提供了 findnextfindprev 函数来开始在给定偏移处搜索字符。 检查以下这两个函数的示例 −

julia> findnext(isequal('o'), "Tutorialspoint", 1)
4
julia> findnext(isequal('o'), "Tutorialspoint", 5)
11
julia> findprev(isequal('o'), "Tutorialspoint", 5)
4

还可以检查是否在字符串中找到子字符串。 我们可以使用 occurrin 函数来实现这一点。 下面给出示例 −

julia> occursin("Julia", "This is, Julia Programming.")
true

julia> occursin("T", "Tutorialspoint")
true

julia> occursin("Z", "Tutorialspoint")
false

repeat() 和 join() 函数

从 Julia 字符串的角度来看,repeat 和 join 是两个有用的函数。 下面的例子解释了它们的用途 −

julia> repeat("Tutorialspoint.com ", 5)
"Tutorialspoint.com Tutorialspoint.com Tutorialspoint.com Tutorialspoint.com Tutorialspoint.com "

julia> join(["TutorialsPoint","com"], " . ")
"TutorialsPoint . com"

非标准字符串文字

文字是一个字符或一组字符,用于存储变量。

原始字符串文字

原始字符串文字是另一种有用的非标准字符串文字。 它们无需插值或转义即可以 raw"..." 的形式表示。 它们创建普通的 String 对象,其中包含与输入相同的封闭内容,无需插值或转义。

示例

julia> println(raw"\\ \\\"")
\\ \"

字节数组文字

字节数组文字是最有用的非标准字符串文字之一。 它有以下规则 −

  • ASCII 字符以及转义字符将生成一个字节。

  • 八进制转义序列以及 \x 将生成与转义值相对应的字节。

  • Unicode 转义序列将生成字节编码序列。

所有这三个规则在某种意义上都是重叠的。

示例

julia> b"DATA\xff\u2200"
8-element Base.CodeUnits{UInt8,String}:
 0x44
 0x41
 0x54
 0x41
 0xff
 0xe2
 0x88
 0x80

上面生成的字节数组不是有效的 UTF-8 字符串,如下所示 −

julia> isvalid("DATA\xff\u2200")
false

版本号文字

版本号文字是另一个有用的非标准字符串文字。 它们可以是v"…"的形式。 VNL创建对象即VersionNumber。 这些对象遵循语义版本控制的规范。

示例

我们可以使用以下语句来定义版本特定的行为 −

julia> if v"1.0" <= VERSION < v"0.9-"
            # you need to do something specific to 1.0 release series
         end

正则表达式

Julia 具有与 Perl 兼容的正则表达式,它们通过以下方式与字符串相关 −

  • RE 用于查找字符串中的规则模式。

  • RE 本身作为字符串输入。 它被解析为一个状态机,然后可以有效地使用该状态机来搜索字符串中的模式。

示例

julia> r"^\s*(?:#|$)"
r"^\s*(?:#|$)"

julia> typeof(ans)
Regex

我们可以使用 occurrin 来检查正则表达式是否与字符串匹配 −

julia> occursin(r"^\s*(?:#|$)", "not a comment")
false

julia> occursin(r"^\s*(?:#|$)", "# a comment")
true