Create new regex from previously existing regex



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?



You can perhaps use the Regex constructor.


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

julia> r1 = r"^cat"

julia> animal = "cat";

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

julia> r1 == r2

julia> r1.pattern

julia> typeof(r1.pattern)


Would 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 * ")$"


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.


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)))


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

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

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