Передайте старый шаблон регулярного выражения в новое пользовательское регулярное выражение, чтобы исключить определенные символы - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть программа с большим количеством строковых констант, используемых для разрешения определенных символов через регулярные выражения.Теперь у меня есть список символов, которые я хочу заблокировать везде, но мне не нужно возвращаться назад ко всем моим старым строковым константам и переписывать их.Вместо этого я хочу создать список запрещенных символов и редактировать этот список только в одном месте (на случай, если он изменится в будущем).Затем я проведу все строковые константы через пользовательское регулярное выражение.

У меня есть список запрещенных символов, определенных в web.config, например:

<add key="RestrChar" value="\!#%&lt;&gt;|&amp;;"/>

Вызов пользовательского регулярного выражениянапример:

[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;
}

И снова я добился неудачи

У кого-нибудь есть другие идеи, как мне достичь своей цели по исключению набора символов независимо от того, какой набор правил регулярных выражений передается в мое пользовательское регулярное выражение?

Спасибо заранее.

1 Ответ

0 голосов
/ 22 апреля 2019

На самом деле понял, что я пытаюсь сделать:

int indexPropRegex = propRegex.IndexOf('^');
string restrictedCharsAction = "(?!.*[" + restricedChars + "]);
propRegex = indexPropRegex == -1 ? propRegex.Insert(0, restrictedCharsAction) : propRegex.Insert(indexPropRegex +1, restrictedCharsAction);
return propRegex;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...