Этот вопрос стар, и это не особенно ясно: вы не объясняют, как вы пытались использовать регулярное выражение. Я все равно попытаюсь ответить.
Прежде всего, нет «специальных» переменных $1
или $2
как в Perl или Ruby. С этой точки зрения становится простым вопросом, как использовать различные процедуры.
Например, с string-match
, вы просто получите список совпадений:
#;1> (use regex regex-literals)
#;2> (string-match #/b(a)(r)/ "bar")
("bar" "a" "r")
Таким образом, чтобы обратиться к дилям submatch вы бы использовать (list-ref the-match N)
(где 0 равна полную найденную строка).
С string-substitute
и при использовании обратных ссылок в регулярном выражении, вы будете использовать "\\1"
(вы должны использовать два обратных слэша, чтобы избежать обратной косой черты в строковом контексте):
#;1> (use regex regex-literal)
#;2> (string-substitute #/f(o)(\1)/ "lala\\2xyz" "foo")
"lalaoxyz"
Это работает вообще, но есть недокументированная функция (или, возможно, ошибка), что, если вы используете обратную косую черту перед escape-последовательностью в замене, она будет экранирована. См. this bugreport о том, как это работает, и как использовать нерегекс вместо яйца регулярных выражений для аовида этого.