Ok, since I could not find a ready-made solution I went ahead and the code 
below seems to cover most of my use cases. Sharing since might be useful to 
others... If something similar is already in Julia base please share... ;)

Cheers,

Robert

const PCRESpecialCharsOutsideCharClasses = ".^\$*+?()[{\\|"
const PCRESpecialCharsInsideCharClasses = "^-]\\"

function escape(repattern::String)
  res = Char[]
  state = :outside_char_class
  for i in 1:length(repattern)
    char = repattern[i]
    if state == :outside_char_class && in(char, 
PCRESpecialCharsOutsideCharClasses)
      push!(res, '\\')
      if char == '['
        state = :inside_char_class
      end
    elseif state == :inside_char_class && in(char, 
PCRESpecialCharsInsideCharClasses)
      push!(res, '\\')
      if char == ']'
        state = :outside_char_class
      end
    end
    push!(res, char)
  end
  join(res, "")
end

repattern(re::Regex) = re.pattern
repattern(s::String) = escape(s)

merge_re(parts...) = Regex(join(map((p) -> repattern(p), parts)))

dynpart = "error(\"a\")"
line = "@check $dynpart"
reparts = ["@check", r"\s+", dynpart]
match(merge_re(reparts...), line)

dynpart2 = "error(\"[a]\")"
line2 = "@check $dynpart2"
reparts2 = ["@check", r"\s+", dynpart2]
match(merge_re(reparts2...), line2)

Reply via email to