У меня есть программа с большим количеством строковых констант, используемых для разрешения определенных символов через регулярные выражения.Теперь у меня есть список символов, которые я хочу заблокировать везде, но мне не нужно возвращаться назад ко всем моим старым строковым константам и переписывать их.Вместо этого я хочу создать список запрещенных символов и редактировать этот список только в одном месте (на случай, если он изменится в будущем).Затем я проведу все строковые константы через пользовательское регулярное выражение.
У меня есть список запрещенных символов, определенных в web.config, например:
<add key="RestrChar" value="\!#%<>|&;"/>
Вызов пользовательского регулярного выражениянапример:
[RestrictCharRegExpress(ConstantStringName, ErrorMessage = CustomErrMsg)]
public string StringName
Класс определяется следующим образом:
public class RestrictCharRegExpressAttribute : RegularExpressionAttribute
{
public RestrictCharRegExpressAttribute(string propRegex) : base(GetRegex(propRegex)){ }
private static string GetRegex(string propRegex)
{
string restrictedChars = ConfigurationManager.AppSettings.Get("RestrChar");
return Regex.Replace(propRegex, $"[{restrictedChars}]+", "");
}
}
Теперь это работает, когда ConstantStringName специально включает в себя некоторые символы, которые я хочу исключить следующим образом:
public const string ConstantStringName = "^[-a-z A-Z.0-9/!&\"()]{1,40}$";
"!"и "&" явно включены, поэтому они заменяются ничем.Но это не сработает, если символы, которые я пытаюсь исключить, не указаны в явном виде и вместо этого включены в список, подобный следующему:
public const string ConstantStringName = "^[ -~\x0A\x0D]{1,40}$";
Я попытался добавить отрицательный прогноз, например так:
return propRegex + "(?![" + restrictedChars + "])";
Но это не работает в обоих случаях.Также попытался установить отрицательный набор:
int i = propRegex.IndexOf(']');
if (i != -1)
{
propRegex = propRegex.Insert(i, "[^" + restrictedChars + "]");
return propRegex;
}
Все еще не работает в обоих случаях.Наконец я попробовал вычитание класса персонажей:
int i = propRegex.IndexOf(']');
if (i != -1)
{
propRegex = propRegex.Insert(i, "-[" + restrictedChars + "]");
return propRegex;
}
И снова я добился неудачи
У кого-нибудь есть другие идеи, как мне достичь своей цели по исключению набора символов независимо от того, какой набор правил регулярных выражений передается в мое пользовательское регулярное выражение?
Спасибо заранее.