# Julia substring return empty string

**URL:** <https://discourse.julialang.org/t/julia-substring-return-empty-string/23442>\
**Category:** New to Julia\
**Created:** [April 23, 2019, 2:00pm UTC](https://discourse.julialang.org/t/julia-substring-return-empty-string/23442 "2019-04-23T14:00:52Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Luigi\_Marongiu](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/luigi_marongiu/32/7909_2.png) [@Luigi\_Marongiu](https://discourse.julialang.org/u/Luigi_Marongiu)\
**Post date:** [April 23, 2019, 2:00pm UTC](https://discourse.julialang.org/t/julia-substring-return-empty-string/23442/1 "2019-04-23T14:00:52Z")

</div>

Dear all,  
I am trying to extract a substring from a string but the result is emtpy:

```julia
julia> x="ATATATATATATATTDTDFTFTCVTVTTSKL:J"
"ATATATATATATATTDTDFTFTCVTVTTSKL:J"
julia> s=SubString(x, 5, 3)
""
julia> typeof(x)
String
julia> typeof(s)
SubString{String}
julia> S=x[5:3]
""
julia> typeof(S)
String

```

What am I getting wrong?

---

<div class="post-metadata">

**Author:** ![oheil](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oheil/32/220745_2.png) [@oheil](https://discourse.julialang.org/u/oheil)\
**Post date:** [April 23, 2019, 2:08pm UTC](https://discourse.julialang.org/t/julia-substring-return-empty-string/23442/2 "2019-04-23T14:08:15Z")

</div>

Your last index is smaller than the starting one.  
You probably want:

```julia
s=SubString(x, 5, 5+3-1)

```

Substring start at index 5 and length=3

> help?\> SubString  
> search: SubString SubstitutionString
> 
> SubString(s::AbstractString, i::Integer, j::Integer=lastindex(s))  
> SubString(s::AbstractString, r::UnitRange{\<:Integer})
> 
> Like getindex, but returns a view into the parent string s within range i:j or r respectively instead of making a copy.
> 
> Examples  
> ≡≡≡≡≡≡≡≡≡≡
> 
> julia\> SubString(“abc”, 1, 2)  
> “ab”
> 
> julia\> SubString(“abc”, 1:2)  
> “ab”
> 
> julia\> SubString(“abc”, 2)  
> “bc”

---

<div class="post-metadata">

**Author:** ![Luigi\_Marongiu](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/luigi_marongiu/32/7909_2.png) [@Luigi\_Marongiu](https://discourse.julialang.org/u/Luigi_Marongiu)\
**Post date:** [April 23, 2019, 2:26pm UTC](https://discourse.julialang.org/t/julia-substring-return-empty-string/23442/3 "2019-04-23T14:26:02Z")

</div>

I see, so I need to work on the indices rater than START, LENGTH as in R/python. Thank you.

---

<div class="post-metadata">

**Author:** ![bkamins](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bkamins/32/208538_2.png) [@bkamins](https://discourse.julialang.org/u/bkamins)\
**Post date:** [April 23, 2019, 2:30pm UTC](https://discourse.julialang.org/t/julia-substring-return-empty-string/23442/4 "2019-04-23T14:30:57Z")

</div>

Note that the indices are byte indices not character indices. You probably should use the [`nextind`](https://docs.julialang.org/en/latest/base/strings/#Base.nextind) function to get what you want for general UTF-8 strings.

See [https://docs.julialang.org/en/latest/manual/strings/#Unicode-and-UTF-8-1](https://docs.julialang.org/en/latest/manual/strings/#Unicode-and-UTF-8-1) for additional explanations.

---

<div class="post-metadata">

**Author:** ![Luigi\_Marongiu](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/luigi_marongiu/32/7909_2.png) [@Luigi\_Marongiu](https://discourse.julialang.org/u/Luigi_Marongiu)\
**Post date:** [April 23, 2019, 4:52pm UTC](https://discourse.julialang.org/t/julia-substring-return-empty-string/23442/5 "2019-04-23T16:52:31Z")

</div>

So would x[5, 5+3-1] be a better choice for extracting substrings? Would the indices be byte ones even in this case? Tx

---

<div class="post-metadata">

**Author:** ![ExpandingMan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/expandingman/32/866_2.png) [@ExpandingMan](https://discourse.julialang.org/u/ExpandingMan)\
**Post date:** [April 23, 2019, 4:59pm UTC](https://discourse.julialang.org/t/julia-substring-return-empty-string/23442/6 "2019-04-23T16:59:17Z")

</div>

Note that if you are using the Julia REPL you can view documentation on functions with `?function_name`.

---

<div class="post-metadata">

**Author:** ![bkamins](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bkamins/32/208538_2.png) [@bkamins](https://discourse.julialang.org/u/bkamins)\
**Post date:** [April 23, 2019, 5:00pm UTC](https://discourse.julialang.org/t/julia-substring-return-empty-string/23442/7 "2019-04-23T17:00:00Z")

</div>

What I want to say is that in Julia there is a difference between character indices and byte indices.

Only if your data is only ASCII they are equivalent. In your example they are, so in such case you are safe to write what you have specified.

If you have UTF-8 data you first have to tell me if you use byte indices (probably not) or character indices (probably yes). In the latter case you should to use functions that operate on characters like `nextind`, `first`, `last` or `chop`. In your case you could write for example `last(first(s, 7), 3)` to get a 3 character string consisting of characters 5, 6 and 7 from the original string. This is not the most efficient way to do it, but it is simplest.

More efficient approach would use `nextind` to calculate byte index of first and last character in your string and do `SubString` using these indices.

---

<div class="post-metadata">

**Author:** ![jonathanBieler](https://avatars.discourse-cdn.com/v4/letter/j/82dd89/32.png) [@jonathanBieler](https://discourse.julialang.org/u/jonathanBieler)\
**Post date:** [April 23, 2019, 5:40pm UTC](https://discourse.julialang.org/t/julia-substring-return-empty-string/23442/8 "2019-04-23T17:40:27Z")

</div>

You can also convert your string into a vector of char, play with the indices and convert back into a string:

```julia
string([c for c in "aαbβ"][4:-1:1]...) == "βbαa"

```

It’s certainly bad performance wise but in many cases it doesn’t matter.

---

<div class="post-metadata">

**Author:** ![bkamins](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bkamins/32/208538_2.png) [@bkamins](https://discourse.julialang.org/u/bkamins)\
**Post date:** [April 23, 2019, 6:50pm UTC](https://discourse.julialang.org/t/julia-substring-return-empty-string/23442/9 "2019-04-23T18:50:06Z")

</div>

Also you can use `eachindex` on string to get an iterator of byte indices that correspond to consecutive characters in the string. Here is an example (along with some performance benchmarks of different methods proposed):

```julia
function charsub(x::AbstractString, from_char, to_char)
    from_idx = 0
    to_idx = 0
    for (i, idx) in enumerate(eachindex(x))
        i == from_char && (from_idx = idx)
        i == to_char && (to_idx = idx; break)
    end
    SubString(x, from_idx, to_idx)
end

```

and the benchmarks:

```julia
julia> using Random, BenchmarkTools

julia> x = randstring(20)
"vfRVI4vxz4RWKu8VBv1E"

julia> @btime string([c for c in $x][5:7]...)
  194.601 ns (4 allocations: 304 bytes)
"I4v"

julia> @btime last(first($x, 7), 3)
  72.986 ns (2 allocations: 64 bytes)
"I4v"

julia> @btime charsub($x, 5, 7)
  51.919 ns (2 allocations: 48 bytes)
"I4v"

```
