从字符串数组中删除特定字符后的所有内容

Tim*_*Tim 5 string julia

这个相当简单的朱莉娅问题让我有点困惑。

假设我有一个“xxx_xxx”形式的字符串数组。是否有一个函数可以删除“_”之后的所有内容?

例子

names = ["last1_first1","last2_first2"]
Run Code Online (Sandbox Code Playgroud)

有没有一个简单的函数可以返回

["last1","last2"]
Run Code Online (Sandbox Code Playgroud)

Nil*_*dat 5

您正在寻找split

julia> names  = ["last1_first1", "last2_first2"]
2-element Array{String,1}:
 "last1_first1"
 "last2_first2"

julia> split.(names, "_")
2-element Array{Array{SubString{String},1},1}:
 ["last1", "first1"]
 ["last2", "first2"]
Run Code Online (Sandbox Code Playgroud)

请注意,我在这里使用点广播语法split.()split函数按元素应用于名称数组。

为了完整起见,提取last元素的一种方法是:

julia> hcat(split.(names, "_")...)[1, :]
2-element Array{SubString{String},1}:
 "last1"
 "last2"
Run Code Online (Sandbox Code Playgroud)

正如卡梅伦在评论中指出的那样,如果它是(如本示例中所示)您要查找的第一个元素,您可以将hcat和 splatting 替换为:

julia> first.(split.(names, "_"))
2-element Array{SubString{String},1}:
 "last1"
 "last2"
Run Code Online (Sandbox Code Playgroud)

对于需要nth 索引的情况,这稍微不太灵活。对于这些情况,您可以广播getindex并向其传递您所在元素的索引:

julia> julia> getindex.(split.(names, "_"), 2)
2-element Array{SubString{String},1}:
 "first1"
 "first2"
Run Code Online (Sandbox Code Playgroud)

或者在您自己的答案中建立正则表达式的想法,您可以简单地执行以下操作:

julia> replace.(names, r"_.*" => "")
2-element Array{String,1}:
 "last1"
 "last2"
Run Code Online (Sandbox Code Playgroud)


Tim*_*Tim 1

我只是遇到一些语法问题

names[:] = map((x) -> replace(x,r"_.*",""),names[:])
Run Code Online (Sandbox Code Playgroud)