Thank you for clarifying.
It's a pity that $regexp() always returns something ($0 or in this case %album% when no match is found and the replacement when a match is found).
With my wordy and error prone workaround from this thread, $lower() (and other string functions that do not have a regex internal replacement like \l) can be used without risking unwanted changes.
$if($neql($regexp(%album%,^(L).*,$1),%album%),$lower($regexp(%album%,^(L).*,$1)),%album%)
The check if the replacement is identical to the source field is needed because otherwise, $lower() would be applied to the source field in the case of no match as seen here:
Match:
No Match:
Which is why I still think it would be a good idea to either add a new string function that is identical to $regexp() except that it returns false when no match is found or to add a fifth parameter to $regexp() that changes the behavior from returning $0 to false in the case of no match.
With such a new string function or with the addition of a fifth parameter, this would be a succinct solution for many problems that avoids maintaining the same regex twice:


