Julia 字符串
Julia 提供了强大的字符串处理功能,支持 Unicode 和多种字符串操作。
字符串基础
创建字符串
julia
# 双引号创建字符串
s = "Hello, Julia!"
println(s)
# 多行字符串(三引号)
multiline = """
这是第一行
这是第二行
这是第三行
"""
println(multiline)
# 原始字符串(不转义)
raw_str = raw"C:\Users\name\Documents"
println(raw_str) # C:\Users\name\Documents字符与字符串
julia
# 字符用单引号
c = 'A'
println(typeof(c)) # Char
# 字符串用双引号
s = "A"
println(typeof(s)) # String
# 字符是 Unicode 代码点
println(Int('A')) # 65
println(Char(65)) # 'A'
println('中') # 中文字符
println(Int('中')) # 20013转义字符
julia
# 常用转义字符
println("换行符\n新行")
println("制表符\t缩进")
println("反斜杠\\")
println("引号\"")
println("单引号\'")
# Unicode 转义
println("\u4e2d\u6587") # 中文
println("\U0001F600") # 😀字符串操作
拼接
julia
# 使用 * 拼接
s1 = "Hello"
s2 = "World"
s3 = s1 * " " * s2
println(s3) # Hello World
# 使用 string 函数
s4 = string(s1, " ", s2)
println(s4) # Hello World
# 使用 join
words = ["Hello", "Julia", "World"]
s5 = join(words, ", ")
println(s5) # Hello, Julia, World字符串插值
julia
name = "Julia"
version = 1.10
# 使用 $ 插值
println("Welcome to $name!")
println("Version: $version")
# 表达式插值用 $()
println("2 + 3 = $(2 + 3)")
println("大写: $(uppercase(name))")
# 嵌套表达式
data = [1, 2, 3]
println("Sum: $(sum(data))")重复字符串
julia
# 使用 ^ 运算符
s = "ab" ^ 3
println(s) # ababab
# 使用 repeat 函数
s = repeat("ab", 3)
println(s) # ababab长度和索引
julia
s = "Hello, Julia!"
# 长度
println(length(s)) # 13(字符数)
println(sizeof(s)) # 13(字节数,ASCII时相同)
# 索引(从1开始)
println(s[1]) # 'H'
println(s[end]) # '!'
println(s[end-1]) # 'a'
# 子字符串
println(s[1:5]) # "Hello"
println(s[8:end]) # "Julia!"
# Unicode 字符串
s_cn = "你好,世界"
println(length(s_cn)) # 5(字符数)
println(sizeof(s_cn)) # 15(字节数,UTF-8)迭代字符串
julia
s = "Julia"
# 迭代字符
for c in s
println(c)
end
# 带索引迭代
for (i, c) in enumerate(s)
println("$i: $c")
end
# 收集为数组
chars = collect(s)
println(chars) # ['J', 'u', 'l', 'i', 'a']字符串函数
大小写转换
julia
s = "Hello, Julia!"
println(uppercase(s)) # HELLO, JULIA!
println(lowercase(s)) # hello, julia!
println(titlecase(s)) # Hello, Julia!
# 首字母大写
println(uppercasefirst("hello")) # Hello
println(lowercasefirst("HELLO")) # hELLO去除空白
julia
s = " Hello, Julia! "
# 去除两端空白
println(strip(s)) # "Hello, Julia!"
# 去除左侧
println(lstrip(s)) # "Hello, Julia! "
# 去除右侧
println(rstrip(s)) # " Hello, Julia!"
# 去除指定字符
s2 = "...Hello..."
println(strip(s2, '.')) # "Hello"查找和替换
julia
s = "Hello, Julia! Hello, World!"
# 查找子字符串
println(findfirst("Julia", s)) # 8:12(范围)
println(findlast("Hello", s)) # 15:19
println(findall("Hello", s)) # 两个范围
# 检查包含
println(contains(s, "Julia")) # true
println(occursin("Julia", s)) # true(参数顺序不同)
# 开头和结尾检查
println(startswith(s, "Hello")) # true
println(endswith(s, "World!")) # true
# 替换
println(replace(s, "Hello" => "Hi"))
# "Hi, Julia! Hi, World!"
# 只替换第一个
println(replace(s, "Hello" => "Hi", count=1))
# "Hi, Julia! Hello, World!"分割和连接
julia
# 分割字符串
s = "apple,banana,cherry"
parts = split(s, ",")
println(parts) # ["apple", "banana", "cherry"]
# 按空白分割
s2 = "Hello World"
println(split(s2)) # ["Hello", "World"]
# 限制分割次数
println(split(s, ",", limit=2)) # ["apple", "banana,cherry"]
# 连接字符串
parts = ["apple", "banana", "cherry"]
println(join(parts, ", ")) # "apple, banana, cherry"
println(join(parts, " & ")) # "apple & banana & cherry"字符操作
julia
# 字符分类
println(isdigit('5')) # true
println(isletter('A')) # true
println(isspace(' ')) # true
println(ispunct('.')) # true
println(isuppercase('A')) # true
println(islowercase('a')) # true
# 字符串分类
println(isascii("Hello")) # true
println(isascii("你好")) # false
println(isnumeric("123")) # 检查每个字符填充和对齐
julia
# 填充
println(lpad("42", 5, '0')) # "00042"
println(rpad("Hello", 10)) # "Hello "
# 指定填充字符
println(lpad("test", 10, '-')) # "------test"
println(rpad("test", 10, '-')) # "test------"字符串比较
julia
s1 = "apple"
s2 = "banana"
s3 = "Apple"
# 相等比较
println(s1 == "apple") # true
# 大小比较(字典序)
println(s1 < s2) # true
# 忽略大小写比较
println(lowercase(s1) == lowercase(s3)) # true
# cmp 函数
println(cmp("a", "b")) # -1
println(cmp("b", "a")) # 1
println(cmp("a", "a")) # 0字符串构建
使用 IOBuffer
对于大量字符串拼接,使用 IOBuffer 更高效:
julia
io = IOBuffer()
for i in 1:5
print(io, "Item $i, ")
end
result = String(take!(io))
println(result) # "Item 1, Item 2, Item 3, Item 4, Item 5, "使用 sprint
julia
# sprint 捕获输出为字符串
s = sprint() do io
println(io, "Line 1")
println(io, "Line 2")
print(io, "Line 3")
end
println(s)格式化输出
@sprintf 宏
julia
using Printf
# 格式化字符串
s = @sprintf("整数: %d, 浮点: %.2f, 字符串: %s", 42, 3.14159, "hello")
println(s)
# 常用格式说明符
@printf("%d\n", 42) # 整数
@printf("%f\n", 3.14) # 浮点数
@printf("%.2f\n", 3.14159) # 2位小数
@printf("%e\n", 12345.0) # 科学计数法
@printf("%s\n", "hello") # 字符串
@printf("%c\n", 'A') # 字符
@printf("%x\n", 255) # 十六进制: ff
@printf("%o\n", 64) # 八进制: 100
@printf("%b\n", 10) # 二进制: 1010
# 宽度和对齐
@printf("%10d\n", 42) # 右对齐,宽度10
@printf("%-10d\n", 42) # 左对齐
@printf("%010d\n", 42) # 补零Unicode 支持
julia
# Julia 原生支持 Unicode
s = "你好,世界!"
println(s)
println(length(s)) # 6 个字符
# Unicode 标识符
α = 0.5
β = 1.5
结果 = α + β
println(结果) # 2.0
# 字符串标准化
using Unicode
s1 = "café"
println(normalize(s1, :NFC)) # 规范化子字符串类型
julia
s = "Hello, Julia!"
# SubString 是字符串的视图,不复制
sub = SubString(s, 1, 5)
println(sub) # "Hello"
println(typeof(sub)) # SubString{String}
# 转换为 String
str = String(sub)
println(typeof(str)) # String实用示例
解析 CSV 行
julia
function parse_csv_line(line)
fields = split(line, ",")
return strip.(fields) # 去除每个字段的空白
end
line = " apple , banana , cherry "
println(parse_csv_line(line)) # ["apple", "banana", "cherry"]模板字符串
julia
function render_template(template, data)
result = template
for (key, value) in data
result = replace(result, "{$key}" => string(value))
end
return result
end
template = "Hello, {name}! You have {count} messages."
data = Dict("name" => "Alice", "count" => 5)
println(render_template(template, data))
# "Hello, Alice! You have 5 messages."单词计数
julia
function word_count(text)
words = split(lowercase(text))
counts = Dict{String, Int}()
for word in words
w = strip(word, ['.', ',', '!', '?'])
counts[w] = get(counts, w, 0) + 1
end
return counts
end
text = "Hello world! Hello Julia. Julia is great!"
println(word_count(text))下一步
学习完字符串后,请继续学习: