Create new regex from previously existing regex

regex

#1

I have a regular expression to match integers just like this
type_int = r"\s*[0-9]*$"

And I would like to create a regular expression to match by using my type_int definition inside the type_float definition on something like this

type_float = r"(^\s*)(-|+)?({type_int})(.)({type_int})$"

an optional ‘+’ or ‘-’ signal, followed by an integer, then a dot ‘.’, then another integer

But it’s not working. Is there a way to use my {type_int} name inside the new definition?

Thanks


#2

You can perhaps use the Regex constructor.


#3

I recall scratching my head about this. I rarely (if ever?) see examples of using the constructor.

julia> r1 = r"^cat"
r"^cat"

julia> animal = "cat";

julia> r2 = Regex("^$animal")
r"^cat"

julia> r1 == r2
true

julia> r1.pattern
"^cat"

julia> typeof(r1.pattern)
String

#4

Would https://github.com/JuliaLang/julia/pull/23422 work for you? Maybe a good time to finish this PR…
EDIT: I realize I should have given an example, which would be I think in your case something like:
type_float = "(^\s*)(-|+)?(" * type_int * ")(.)(" * type_int * ")$"


#5

Funny, I use it all the time! Like op, I often match a regular expression and then use the match to build a new one.


#6

Here is a possible solution.
First define a non-standard string macro

macro rs_str(pattern)
    :(Regex(replace($pattern, r"\{\w+\}", x->eval(Symbol(x[2:end-1])).pattern)))
end

Then

julia> type_int = r"\s*[0-9]*$"
 r"\s*[0-9]*$"

# non-standard string rs"..." produces a new regular expression
julia> rs"(^\s*)(-|\+)?({type_int})(.)({type_int})$" 
r"(^\s*)(-|\+)?(\s*[0-9]*$)(.)(\s*[0-9]*$)$"

Note that your example is not very suitable to identify floating point numbers. But that is beside the point of this exercise :wink: