Регулярное выражение для цифровых символов и .

#c# #.net #regex #numeric #numerical

#c# #.net #регулярное выражение #числовое

Вопрос:

Я использую C # и .NET, и у меня есть регулярное выражение, которое выглядит следующим образом

 "D"
  

Это соответствует всем нечисловым символам, однако я не хочу, чтобы это соответствовало десятичной точке (.) и знаку отрицания (-). Как я могу сделать это с помощью регулярных выражений?

Итак, я попробовал Chris, и он внес несколько изменений, чтобы заставить его работать:

(У меня есть текстовое поле с именем «Original»)

  private void Original_TextChanged(object sender, EventArgs e) {
      Regex regex = new Regex(@"[^d.-]", RegexOptions.IgnoreCase);
      Match match = regex.Match(Original.Text);
      if (match.Success) {
          Original.Text = regex.Replace(Original.Text, "");
          Original.SelectionStart = Original.TextLength;
      }
  }
  

Это Original.SelectionStart = Original.TextLength; потому, что всякий раз, когда оно заменялось, оно помещало выделение в начало, и это показалось бы пользователю немного странным…

Ответ №1:

Вы можете использовать класс отрицаемых символов, чтобы исключить числа, . и - . Выражение для сопоставления одного символа, подобного этому, является [^d.-] . Курсор указывает, что класс отрицается.

 Regex.IsMatch("a f", @"^[^d.-] $"); // true
Regex.IsMatch("a_f", @"^[^d.-] $"); // true
Regex.IsMatch("a.f", @"^[^d.-] $"); // false
Regex.IsMatch("af-", @"^[^d.-] $"); // false
Regex.IsMatch("-42", @"^[^d.-] $"); // false
Regex.IsMatch("4.2", @"^[^d.-] $"); // false
  

Комментарии:

1. На самом деле нет необходимости экранировать - в этой позиции: можно также прекрасно использовать [^d.-] .

2. @mousio: да! Хороший момент, хотя я всегда с опаской отношусь к этому 🙂 Глупое суеверие, я полагаю.

3. Также нет необходимости избегать точки. Помните, что классы символов, заключенные в квадратные скобки, имеют (почти) полностью отличный синтаксис от остальной части регулярного выражения. [^d.-] действительно сработало бы. Тем не менее, трудно винить людей за то, что они избегают ДЕФИСА с МИНУСОМ, поскольку он и каретка чувствительны к положению относительно того, нужно ли им экранирование, чтобы рассеять их (ab) обычную магию.

4. То же самое касается . , любого места внутри (отрицаемого) символьного класса, но я могу согласиться с вами, чтобы просто экранировать в любом случае, когда вы хотите выразить литерал :]