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