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的字符串支持[]形式的索引,索引值既可以是数字,也可以是begin,end等。(后者就像是MATLAB的数组索引!)返回一个字符。
x = "abcd"
length(x) # 4
x[begin] # 'a'
x[1] # 'a'
x[end-1] # 'c'
firstindex(x), lastindex(x) # (1, 3)
函数length返回一个字符串的实际长度。firstindex和lastindex返回字符串索引的开始和结束的位置。
注意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库中。