How to find and replace (Regx) in string abcdac only 'a' who is not before 'c'?

Ho to find and repalce (Regx) in string abcdac only a who is not before c ?
Paul

Are you having trouble finding a regex to do that ? or using julia to replace a regex match in a string ?

2 Likes

If the issue is with finding the proper regex, regex101.com is usually an invaluable resource.

Also: [ANN] ReadableRegex.jl might help

2 Likes
julia> s="aabcacab"
"aabcacab"

julia> rx=r"a[^c]"
r"a[^c]"

julia> for m in eachmatch(rx,s;overlap=true)
       println(m,m.offset)
       end
RegexMatch("aa", 1="a")1
RegexMatch("ab", 1="a")2
RegexMatch("ab", 1="a")7
1 Like

A “a” at the end of the string is not yet matched, so:

julia> s="aabc acaba"
"aabc acaba"

julia> rx=r"(a[^c])|(a$)"
r"(a[^c])|(a$)"

julia> for m in eachmatch(rx,s;overlap=true)
       println(m,m.offset)
       end
RegexMatch("aa", 1="aa", 2=nothing)1
RegexMatch("ab", 1="ab", 2=nothing)2
RegexMatch("ab", 1="ab", 2=nothing)8
RegexMatch("a", 1=nothing, 2="a")10

julia> sa=split(s,"");

julia> for m in eachmatch(rx,s;overlap=true)
              sa[m.offset]="x"
              end

julia> new_s=join(sa)
"xxbc acxbx"
3 Likes

Sounds like you want a “negative lookahead assertion”: the expression (?!......) means “don’t match the following, and don’t make it part of the capture”. So in your case, r"a(?!c)" is what you are looking for.

4 Likes

And now replace works better:

julia> rx=r"a(?!c)"
r"a(?!c)"

julia> s="aabc acaba"
"aabc acaba"

julia> replace(s,rx=>"x")
"xxbc acxbx"
1 Like