Julia tiene PCRE , lo que significa que sus expresiones regulares son mucho más poderosas que las verdaderas expresiones regulares. Y de hecho, están completos. Sospecho que hay un montón de ciencias informáticas teóricas interesantes sobre esto. Sospecho que su tarea para PCRE podría resultar imposible debido al problema de detención . Pero aún así, lo que podemos hacer es probar un montón de cadenas aleatorias y tirar las que no coinciden. Y para expresiones regulares simples, eso es muy útil. Sin embargo, no se garantiza que responda.
Si uno quisiera una expresión regular más estricta, como las cubiertas por Automa.jl , probablemente haya algo mejor que se pueda hacer, ya que puede recorrer la máquina de estados resolviéndola de a poco. Esperemos que alguien que sepa Automa.jl pueda publicar su propia respuesta.
Código
using Random: randstring
function rand_matching(regex; max_len=2^16, max_attempts=1000)
for _ in max_attempts
str = randstring(max_len)
m = match(regex, str)
if m != nothing
# rather than return whole string,
# just return the shortest bit that matches
return m.match
end
end
error("Could not find any string that matches regex")
end
manifestación:
julia> @time rand_matching(r"\d\d")
0.013517 seconds (34.34 k allocations: 1.998 MiB)
"38"
julia> @time rand_matching(r"\d\d")
0.001497 seconds (11 allocations: 128.656 KiB)
"44"
julia> @time rand_matching(r"a\d\d")
0.000670 seconds (11 allocations: 128.656 KiB)
"a19"
julia> @time rand_matching(r"a\d\d")
0.000775 seconds (11 allocations: 128.656 KiB)
"a83"
julia> @time rand_matching(r"a\d\db")
0.000670 seconds (11 allocations: 128.656 KiB)
"a44b"