Пользовательское регулярное выражение для исключения списка символов - PullRequest
1 голос
/ 05 апреля 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 = ConfigureationManager.AppSettings.Get("RestrChar");
        string[] thisCharArray = restrictedChars.Split(',');
        string regexPrep = "";
        foreach (string c in thisCharArray)
        {
            regexPrep = string.Format(@"""{0}""", c);
            propRegex = Regex.Replace(propRegex, regexPrep, "");
        }
        return propRegex;
    }
}

Но это не удаление персонажей, как я ожидал. Что я делаю неправильно?

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

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Вы можете удалить foreach и использовать

private static string GetRegex(string propRegex)
{
    string restrictedChars = ConfigureationManager.AppSettings.Get("RestrChar");
    string[] thisCharArray = restrictedChars.Split(',');
    return Regex.Replace(propRegex, 
        $"[{string.Concat(thisCharArray)}]+", "");
}

Обратите внимание, что вам нужно только экранировать ^, -, \, ], если вы используете этот подход.

Если вы оставите их без присмотра в value, вы можете сделать это в коде:

var regex = string.Concat(
        thisCharArray.Select(x => 
            x.Replace("\\", @"\\").Replace("]", @"\]").Replace("^", @"\^").Replace("-", @"\-")
        )
 );
 return Regex.Replace(propRegex, 
        $"[{regex}]+", ""); 
1 голос
/ 07 апреля 2019

Вы можете добавить положительное предпросмотр subexpresión, заставляющий совпадение соответствовать шаблону, подобному

(?=^[^yourcharlisthere]*$)

, который привязывает вашу строку к началу и концу, так как все символы должны отсутствовать в соответствующей строке.

Или вы можете добавить отрицательное подвыражение, которое отвергает, как только в строке есть один символ в списке.

(?![yourcharlisthere])

на этот раз вам не нужно привязывать, как только один изсимволы совпадают, полное подвыражение совпадает, и, как таковая, ваша строка отклоняется.Просто добавьте их в начале вашего оригинального регулярного выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...