Вы можете использовать оценщик совпадений с немного измененным регулярным выражением:
var strs = new List<string> { "*10.18).xlsx", "*(23.10.18).xlsx" };
var block = @"[][+&|!(){}^""~?: \\/-]";
var rx = new Regex($@"(\*)({block}?)|{block}");
foreach (var str in strs) {
string reg = "id:" + rx.Replace(str, m =>
m.Groups[1].Success ? $"*\\{m.Groups[2].Value}" : $"\\{m.Value}");
Console.WriteLine(reg);
}
См. Демонстрацию C # .Вывод: id:*\10.18\).xlsx
(для *10.18).xlsx
) и id:*\(23.10.18\).xlsx
(для *(23.10.18).xlsx
).
Шаблон будет соответствовать
(\*)([][+&|!(){}^""~?: \\/-]?)
- звездочка занесена в группу1 и любой из символов в блоке, 1 или 0 раз (необязательно) |
- или [][+&|!(){}^""~?: \\/-]
- класс символов, соответствующий ]
, [
,+
, &
, |
, !
, (
, )
, {
, }
, ^
, "
, ~
, ?
, :
,
, \
, /
и -
Если совпадение группы 1 соответствует, совпадение заменяется значением *\
+ группы 2, в противном случае обратный слеш предшествует передсоответствующий символ.