1:- use_module(library(regex)).    2
    3:- dynamic
    4	pattern_cache/3.		% Pattern, Flags, Regex
    5
    6regex_replace(Input, Pattern, Replace0, Flags, Result) :-
    7	dollar_replace(Replace0, Replace),
    8	with_mutex(sparql_regex,
    9		   locked_replace(Input, Pattern, Replace, Flags, Result)).
   10
   11dollar_replace(Replace0, Replace) :-
   12	sub_atom(Replace0, _, _, _, $), !,
   13	regex_replace(Replace0, '\\$([0-9])', '\\\\1', '', Replace).
   14dollar_replace(Replace, Replace).
   15
   16locked_replace(Input, Pattern, Replace, Flags, Result) :-
   17	regex_obj(Pattern, Flags, Regex),
   18	new(S, string('%s', Input)),
   19	send(Regex, for_all, S,
   20	     message(@arg1, replace, @arg2, Replace)),
   21	get(S, value, Result).
   22
   23regex_obj(Pattern, Flags, Regex) :-
   24	pattern_cache(Pattern, Flags, Regex), !.
   25regex_obj(Pattern, Flags, Regex) :-
   26	make_regex(Pattern, Flags, Regex),
   27	asserta(pattern_cache(Pattern, Flags, Regex)).
   28
   29make_regex(Pattern, i, Regex) :- !,
   30	new(Regex, regex(Pattern, @(off))).
   31make_regex(Pattern, _, Regex) :- !,
   32	new(Regex, regex(Pattern))