字符串问题,怎么取得特定字母前的数字,有现成的函数么

我想取得字符串c=“9S8M13S”,S前的数字。返回9和13

julia> c="9S8M13S"
"9S8M13S"
julia> fs=findall(r"\d*S",c)
2-element Vector{UnitRange{Int64}}:
 1:2
 5:7
julia> first.(fs)
2-element Vector{Int64}:
 1
 5
julia> last.(fs).-1
2-element Vector{Int64}:
 1
 6
julia> z=zip(first.(fs),last.(fs).-1)
zip([1, 5], [1, 6])

a=Int[]

for (i,j) in z
    push!(a,parse(Int,c[i:j]))
end

julia> a
2-element Vector{Int64}:
  9
 13

有没有更直接的方法呢,这样感觉有点麻烦呢

我的建议是先提取字符串中的所有数字,然后再转换类型。

julia> a = "9S8M13S"
"9S8M13S"

julia> ii = findall(r"\d+\.?\d*(?=S)",a)
2-element Vector{UnitRange{Int64}}:
 1:1
 5:6

julia> parse(Int, a[ii[1]])
9

参考 @RexWzh 的回答,我也写了个一行版本。

julia> [parse(Int, a[i]) for i in findall(r"\d+\.?\d*(?=S)",a)]
2-element Vector{Int64}:
  9
 13
3 个赞

正则表达式

reg = r"(\d+)S"
[parse(Int, i.captures[1]) for i in eachmatch(reg, "9SM13S")]
# 2-element Vector{Int64}:
#  9
# 13

或者用命名分组,增加可读性

reg = r"(?<num>\d+)S"
[parse(Int, m[:num]) for m in eachmatch(reg, "9SM13S")]

参考楼上回答,也可以用断言而不借助分组

reg = r"\d+(?=S)"
[parse(Int, m.match) for m in eachmatch(reg, "9SM13S")]

相关用法可以看这个笔记

2 个赞

原来要用 eachmatch。学习了。

谢谢大佬,学习了

谢谢大佬解答,666