diff --git a/base/regex.jl b/base/regex.jl index cde0bac13eaa9..1e5b2a91163ff 100644 --- a/base/regex.jl +++ b/base/regex.jl @@ -571,7 +571,9 @@ end *(r::Regex) = r # avoids wrapping r in a useless subpattern wrap_string(r::Regex, unshared::UInt32) = string("(?", regex_opts_str(r.compile_options & unshared), ':', r.pattern, ')') -wrap_string(s::Union{AbstractString,AbstractChar}, ::UInt32) = string("\\Q", s, "\\E") +# if s contains raw"\E", split '\' and 'E' within two distinct \Q...\E groups: +wrap_string(s::AbstractString, ::UInt32) = string("\\Q", replace(s, raw"\E" => raw"\\E\QE"), "\\E") +wrap_string(s::AbstractChar, ::UInt32) = string("\\Q", s, "\\E") regex_opts_str(opts) = (isassigned(_regex_opts_str) ? _regex_opts_str[] : init_regex())[opts] diff --git a/test/regex.jl b/test/regex.jl index 56dfef0666bb4..76c36b76edf84 100644 --- a/test/regex.jl +++ b/test/regex.jl @@ -107,6 +107,10 @@ @test r"a"im * r"b"im == r"(?:a)(?:b)"im @test r"a"im * r"b"i == r"(?m:a)(?:b)"i + r = r"" * raw"a\Eb|c" + @test match(r, raw"a\Eb|c").match == raw"a\Eb|c" + @test match(r, raw"c") == nothing + # error for really incompatible options @test_throws ArgumentError r"a" * Regex("b", Base.DEFAULT_COMPILER_OPTS & ~Base.PCRE.UCP, Base.DEFAULT_MATCH_OPTS) @test_throws ArgumentError r"a" * Regex("b", Base.DEFAULT_COMPILER_OPTS, Base.DEFAULT_MATCH_OPTS & ~Base.PCRE.NO_UTF_CHECK)