Julia: String

1,111 阅读2分钟

Julia中的字符串

字符串就是一列字符“串”起来。Julia作为一名“10后”编程语言,完全支持所有的unicode字符!

Characters

字符是字符串的基本元素,在Julia中用单引号包围,同时用'\u...'的方式支持各类unicode字符:

Int('x')  # 120
'\u2200'  # '∀': Unicode U+2200 (category Sm: Symbol, math)

字符可以比较大小,还能做加减:

'A' <= 'X' <= 'Z'  # true
'A' <= 'a' <= 'Z'  # false
'x' - 'a'  # 32
'\u3000' - 'a'  # 12191

String Basics

Julia中的字符串需要用双引号或者三个双引号包含起来,比如 "Hello, world.\n""""Contains "quote" characters"""是合法的字符串。

三个引号包围的方式适合生成更长的字符串:

str = """
Hello,
world.
"""
# " Hello,\n world.\n"

Julia的字符串是不可变类型。

Julia的字符串支持[]形式的索引,索引值既可以是数字,也可以是beginend等。(后者就像是MATLAB的数组索引!)返回一个字符。

x = "abcd"
length(x)  # 4
x[begin] # 'a'
x[1]  # 'a'
x[end-1]  # 'c'
firstindex(x), lastindex(x)  # (1, 3)

函数length返回一个字符串的实际长度。firstindexlastindex返回字符串索引的开始和结束的位置。

注意Julia的索引是从1开始的!!!

使用范围索引,或者说切片,能够得到一个字符子串。

x[1:3]  # "abc"
SubString(x, 1, 2)  # "ab"
SubString(x, 1)  # "abcd"

注意这里索引结果与Python的区别!内置的SubString提供了类似索引的功能。

Unicode and UTF-8

Julia使用unicode的时候,需要注意,不是所有的位置,都是字符串的合法索引位。

s = "\u2200 x \u2203 y"  # "∀ x ∃ y"
s[1]  # '∀'
s[2]  # ERROR: StringIndexError("∀ x ∃ y", 2)
s[4]  # ' ', 4是s的第二个合法的索引位,第一个是1
nexind(s, 1)  # 4
lastindex(s), length(s)  # (11, 7)

函数nextind可以帮我们找到字符串的下一个合法的索引位。(对应的还有prevind函数)。length的返回值,它可能不等于字符串的最后一个索引位!

事实上我们大部分时间不会处理这样的字符串,或者说不会去索引它的特定位置。

如果要遍历一个字符串的字符,我们可以使用for循环和关键字in

for c in s
    println(c)
end

上面的逐次输出的单个字符保证合法。

Concatenation and Interpolation

Julia使用*符号来进行字符串的合并。 也可以使用string的构造函数。

greet, whom = "hello", "world"
greet * whom # "helloworld"
string(greet, ", ", whom, ".\n")  # "hello, world.\n"
# 如果要把转义符打出来的话,要`print`一下

关于Julia为什么要使用*而不使用+来进行字符串连接,官方是这样解释的:在抽象代数中,“加法”一般被认为是可交换的,而“乘法”一般被视作不可交换的,字符串相加是不交换的运算,使用“乘法”更符合数学家的思维。

对于字符串的format,Julia提供了类似Perl/Shell语言的方法:

"$greet, $whom.\n"  # "Hello, world.\n"
"1 + 2 = $(1 + 2)"  # 2 = $(1 + 2)"
v = [1,2,3]
"v: $v"  # "v: [1, 2, 3]"

为了打出正常的$符,可以用\反斜杠转义。

Common Operations

Julia支持字符串比较大小,方式是逐字符比较:

"abracadabra" < "xylophone"  # true
"abracadabra" == "xylophone"  # false

Julia判断字符子串是用occursin函数:

occursin("world", "Hello, world.")  # true
# 等价于Python 中的 `"world" in "Hello, world."`

其他操作:

join([1,2,3,4,5])  # "12345"
repeat(".:Z:.", 10)  # ".:Z:..:Z:..:Z:..:Z:..:Z:..:Z:..:Z:..:Z:..:Z:..:Z:."

字符串与数字之间的转换:

parse(Int, "15")  # string -> Int
string(13.2)  # Float64, Int -> string
parse(Float64, "13.2")  # string -> Float64

格式化打印,需要using Printf

a = 12.124
@printf "%d is less than %.2f" a 5.3  # 直接打印
l = @sprintf "%d is less than %.2f" a 5.3  # 将字符串格式化的结果保存

Julia与print相关的宏,在1.0左右版本还是在Base里面的,新版本(现在是1.5+)将这部分放入了Printf库中。