Für alle anderen:
${"foo bAr baar"?replace('ba*', 'XY', 'r')}
Ergebnis:
foo XYAr XYr
siehe Freemarker ?replace aber wichtig ist das Flag 'r' am Ende für reguläre Ausdrück.
Das ist glaube ich etwas Frage des Geschmacks bzw. der Perspektive. Um etwas aus einem String "herauszuholen" (bei dir "Baumwolle") finde ich ?matches mit ?groups besser, statt etwas zu mit ?replace zu ersetzen. Ein Ersetzen ist auch immer teurer (Performance). In der Freemarker Doku zu ?matches stehen ganze gute Beispiele wie man auf groups zugreift z.B.:
<#assign res = "John Doe"?matches(r"(\w+) (\w+)")>
<#if res> <#-- Must not try to access groups if there was no match! -->
First name: ${res?groups[1]}
Second name: ${res?groups[2]}
</#if>
Hinweis am Rande: Wenn du aber mal wirklich ein Suchen & Ersetzen brauchst, dann ist unter Performance-Gesichtspunkten die Variante über unsere Mapper-Funktionen etwas besser. Dort werden die regulären Ausdrücke gecached und nicht jedes mal neu kompiliert. Relevant wenn du mal viele Zeilen und Suchen/Ersetzen hast.
Nachtrag: Der initiale Vorschlag mit ?replace war, weil du in deinem ersten Post Suchen & Ersetzen geschrieben hast, aber leider kein Beispiel genannt hattest. Nach deinem Beispiel sieht ?matches passender aus.