1:- use_module(library(regex)). 2
3:- dynamic
4 pattern_cache/3. 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))